顺序执行的异步操作:命名,Promise,任务,非队列

针对比特币的交易,涉及到收集UTXO,创建交易,发送交易,获取网络反馈,进入内存池,打包进入区块,等等一系列的异步操作。而每一步都需要等待之前的步骤完成。

下面这个刚刚创建的库,可以帮助解决部分异步等待问题 https://www.npmjs.com/package/named-promise-task (opens new window)

顺序执行的异步操作,“异步任务队列“是一个需要记住的词。

可以先看一下async.series (opens new window)要解决的问题

async.series([
    function(callback) {
        // do some stuff ...
        callback(null, 'one');
    },
    function(callback) {
        // do some more stuff ...
        callback(null, 'two');
    }
],
// optional callback
function(err, results) {
    // results is now equal to ['one', 'two']
});

两个异步函数,在async.series的包裹下,可以顺序执行。 使用 Promise, 可以用 Promise.each 顺序执行一系列异步函数。 异步函数如果很复杂,包含很多步骤。我们称为一个任务。在我们做好的库中是这么用的


const PromiseTask = require('named-promise-task')

const sleep = ( ms ) => new Promise( ( resolve, _ ) => setTimeout( () => resolve(), ms ) )

const that = 'outer'
const fetch = async ( p1 ) => {
  await sleep( 1000 )
  console.log( 'fetch', p1, this, that )
  return 'fetch result'
}

async function fetch2 ( p1, p2 ) {
  await sleep( 1000 )
  //"this" is context
  console.log( 'fetch2', p1, p2 )
}


const error = async ( ...values ) => {
  await sleep( 1000 )
  throw 'error'
}

async function test () {
  const that = 'inner'

  const upload = async ( p1, p2, p3 ) => {
    await sleep( 1000 )
    console.log( 'upload', p1, p2, p3 )
  }

  const manager = new PromiseTask( this, {
    fetch: fetch,
    fetch2: fetch2,
    upload: upload,
    error: error
  } )

  manager.addTask( 'fetch', 1 ).then( console.log )
  manager.addTask( 'fetch2', 2, "str" )
  manager.addTask( 'error', 3, "str", { options: 3 } ).then( console.log ).catch( console.error )
  manager.addTask( 'upload', 4, "str", { options: 4 } )
  await sleep( 1000 )
  manager.addTask( 'fetch', 5, "str", { options: 5 } )
}

test()

每一个异步任务,随时追加到管理器中,顺序执行。不必使用数组,随时添加随时执行,前一个执行完,执行后一个。

比特币开发,涉及到非常多的技术细节,简单而且优美的解决方案是我们尽力去追求的。

在开发Note.SV (opens new window)时,我们创作这种优美