【问题标题】:Asyncawait.js multiple arguments in callback回调中的 Asyncawait.js 多个参数
【发布时间】:2016-06-08 15:16:21
【问题描述】:

我对@9​​87654321@ 库越来越满意了。

如果我是正确的,这是:

var doSth = async function() {
  var asyncResult = await promiseReturningFunction();
  subFunction(asyncResult);
};

相当于:

var doSth = function() {
  promiseReturningFunction().then(function(asyncResult) {
    subFunction(asyncResult);
  });
};

但是如果回调有两个参数.then(function(asyncResult1, asyncResult2) {})呢?

在其他一些语言中,我会写:

  var asyncResult1, asyncResult2 = await promiseReturningFunction();

但是我不能在 JS 中做到这一点,可以吗? await 是否返回一个数组?第一个参数?

【问题讨论】:

  • asyncawait 库和即将推出的async/await 是两个不同的东西。它们可能以非常相似的方式工作,但你应该澄清你在说哪一个。即使您链接到该库,您的示例似乎也没有使用该库。
  • 你使用的是实验性的 async/await 转译器,还是那个基于光纤的库?

标签: javascript async-await


【解决方案1】:

我不能在 JS 中做到这一点,可以吗?

不,你不能。 Promise 只用一个值实现。

JavaScript 没有元组,但您可以使用数组来实现。通过解构,您可以让它看起来几乎像其他语言一样:

async function promiseReturningFunction() {
    await …;
    …
    return [result1, result2];
}

// elsewhere (in an async function):
var [asyncResult1, asyncResult2] = await promiseReturningFunction();

【讨论】:

    【解决方案2】:

    您可以轻松地将destructuring 用于一堆这样的承诺:

    var [r1, r2, r3] = await Promise.all([p1, p2, p3]);
    

    var promises = [p1(), p2(), p3()];
    $q.all(promises)
      .then(function ([p1Result, p2Result, p3Result]) {
          // ...
      });
    

    所以你将拥有:

    async function doSth() {
        var [asyncResult1, asyncResult1] = await promiseReturningFunction();
        var asyncLastResult = await subFunction(asyncResult1);
    
        return asyncLastResult;
    }
    
    doSth();
    

    【讨论】:

      【解决方案3】:

      Promises 只能将一个参数传递给实现回调。 As Benjamin Gruenbaum writes:

      [...] 只有第一个参数将被视为 promise 构造函数中的分辨率值。您可以使用对象或数组等复合值进行解析。

      (Here is the section in the Promises/A+ specification)

      因此,在 JavaScript 中不会出现带有两个参数的情况(至少不会出现在标准的 Promise 实现中)。只需使用数组或对象(取决于您的数据结构)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 2018-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多