3
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
}

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

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

q.ninvoke(myNodeJsFunc).then(function(arg1, arg2, arg3) {
    // do stuff
    if(arg2) {
        // do stuff
    }
    // etc.
});
4

1 回答 1

5

你可以,你所追求的是spread

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

这不是默认设置的原因是,promise 背后的部分前提是让它们尽可能地像同步对应物。这样,将来您将能够:

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

看起来yield是同步的,除了神奇发生的关键字。

运算符很好,spread因为在 JavaScript 的下一个版本中,您将能够编写:

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

这很好地平行于同步代码:

let [arg1, arg2, arg3...] = mySyncFunc();
arg1, arg2 ...

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

于 2013-01-29T22:59:49.283 回答