Javascript 从回调调用asyncwait

Javascript 从回调调用asyncwait,javascript,node.js,callback,async-await,promise,Javascript,Node.js,Callback,Async Await,Promise,我有一个使用该模块编写的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));

我有一个使用该模块编写的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 }
顺便说一句,如果我在“async.cps”行内联foo实现,它就可以工作(但这不是一个选项,因为它是一个外部库)


有什么想法吗?

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

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

async.cps(…)
将返回一个接受一些输入值的函数和一个节点式回调函数(
函数(err,res)
),执行时将返回一个void(
未定义的
)。在内部,它将使用输入参数调用
fn
,并在
fn
返回相应值时调用回调函数

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

如果要使用此库将承诺“转换”为节点样式的回调函数(取消误用!),可以执行以下操作:

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

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

您双重异步了
foo
函数。以下是您的选项,具体取决于您是否可以修改
foo
的声明:

保持
foo
async,并创建一个函数
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
async,并使用async
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();