从回调调用asyncwait

calling asyncwait from a callback

本文关键字:asyncwait 调用 回调      更新时间:2023-09-26

我有一个使用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 }

顺便说一句,如果我内联foo的实现在async。(但这不是一个选项,因为它是一个外部库)。

任何想法?

我查看了您使用的库,从它的外观来看(没有太多,当然没有工作示例),您没有正确使用它。

async(fn)将返回一个接受一些输入值的函数,并在执行时返回一个promise(可能是标准的Promises/a +)。在内部,它将使用输入参数调用fn,并在fn返回时解析返回的承诺。

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

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

如果你想使用这个库将一个promise"转换"为一个node风格的回调函数(不承诺!),你可以这样做:

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

您对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();

foo在声明时已经是cps了:

var async = require('asyncawait/async');
var await = require('asyncawait/await');
var Promise = require('bluebird');
var foo = async.cps(function() {
    var resultA = await (Promise.promisify(bar));
    return 111;
});
function bar(callback) {
  setTimeout(callback, 1000);
}
function moo() {
  foo(function(err, res) {
    console.log(res);
  });
}
moo();