node.js Q promises library - 如何使用正确的参数列表从ninvoke回调

Nat*_*ley 3 node.js promise q

q.ninvoke(myNodeJsFunc).then(function(result) {
    console.log(arguments);
});

function myNodeJsFunc(callback) {
    callback(null, arg1, arg2, ..., argN); // first argument is null as no error occurred
}
Run Code Online (Sandbox Code Playgroud)

如果我只回传arg1,result将会arg1.如果我传回多个参数,result将是一个参数数组.有没有办法让Q回调我的每个参数作为单独的参数应用于函数,而不是捆绑到一个数组并作为单个参数传回?我希望能够使用命名参数而不必筛选任意元素数组.

实际上,我是能够做到这一点:

q.ninvoke(myNodeJsFunc).then(function(arg1, arg2, arg3) {
    // do stuff
    if(arg2) {
        // do stuff
    }
    // etc.
});
Run Code Online (Sandbox Code Playgroud)

For*_*say 5

你可以,你所追求的是spread:

q.ninvoke(myNodeJsFunc)
  .spread(function(arg1, arg2, arg3) {
    // do stuff
    if(arg2) {
      // do stuff
    }
    // etc.
  });
Run Code Online (Sandbox Code Playgroud)

这不是默认的原因是承诺背后的前提部分是使它们尽可能地与同步对应物一样.这样你将来可以做到:

spawn(function* () {
  var res = yield q.ninvoke(myNodeJsFunc);
  res[0], res[1]...
});
Run Code Online (Sandbox Code Playgroud)

哪个看起来是同步的,除了yield魔法发生的关键字.

spread运营商是很好的,因为在JavaScript中的下一个版本你就可以这样写:

spawn(function* () {
  let [arg1, arg2, arg3...] = yield q.ninvoke(myNodeJsFunc);
  arg1, arg2 ...
});
Run Code Online (Sandbox Code Playgroud)

这与同步编码非常相似:

let [arg1, arg2, arg3...] = mySyncFunc();
arg1, arg2 ...
Run Code Online (Sandbox Code Playgroud)

简而言之,当您需要多个参数时,请替换thenspread.