从回调中调用asyncwait

时间:2015-09-30 22:57:33

标签: javascript node.js callback async-await promise

我有一个使用async/await模块编写的nodejs库。我尝试从使用常规回调的库中使用它。以下是示例代码:

var async = require('asyncawait/async');
var await = require('asyncawait/await');
var Promise = require('bluebird');

var foo = async (function() {
    var resultA = await (Promise.promisify(bar));
    return 111;
})

function bar(callback) {
  setTimeout(callback, 2000)
}

function moo() {
  var f = async.cps(foo)

  f(function(err, res) {
    console.log(res)
  })

}

moo()

我希望console.log能够打印111,而是打印出来:

{ _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _progressHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined,
  _settledValue: undefined }

btw如果我在“async.cps”行中内联foo实现它可以工作(但这不是一个选项,因为它是一个外部库)。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我看过你使用的库,看看它(没有太多,当然也没有工作样本),你没有正确使用它。

async(fn)将返回一个接受某些输入值的函数,并在执行时返回一个promise(可能是standard Promises/A+)。在里面,它将使用输入参数调用fn,并在fn返回时解析返回的保证。

async.cps(...)将返回一个函数,该函数接受一些输入值一个节点样式的回调函数(function (err, res))并在执行时返回一个void(undefined )。在里面,它将使用输入参数调用fn,并在fn返回时使用适当的值调用回调函数。

您的代码所做的是使用async(fn)创建一个函数,然后将此函数传递给async.cps(..),就好像您调用async.cps(async(fn))一样,但这没有任何意义。

如果你想使用这个库将一个promise转换为一个节点样式的回调函数(unpromisifying!),你可以做的是:

function moo() {
  var f = async.cps(function() {
    return await (foo())
  })

  f(function(err, res) {
    console.log(res)
  })
}

答案 1 :(得分:1)

你再次使用了foo函数。以下是您的选择,具体取决于您是否可以修改foo的声明:

保持foo异步,并创建一个函数f,使用cps接受节点式回调:

var async = require('asyncawait/async');
var await = require('asyncawait/await');
var Promise = require('bluebird');

var foo = async(function() {
    var resultA = await (Promise.promisify(bar));
    return 111;
});

function bar(callback) {
  setTimeout(callback, 1000);
}

function moo() {
  var f = async.cps(function() {
    return await(foo());
  });
  f(function(err, res) {
    console.log(res);
  });
}

moo();

保持foo异步,并使用异步moo

var async = require('asyncawait/async');
var await = require('asyncawait/await');
var Promise = require('bluebird');

var foo = async(function() {
    var resultA = await (Promise.promisify(bar));
    return 111;
});

function bar(callback) {
  setTimeout(callback, 1000);
}

var moo = async(function() {
  try {
    var res = await(foo());
    console.log(res);
  } catch (err) {
  }
});    

moo();

在宣言中<{1}}已foo

cps