【问题标题】:How to return promise from a function that itself uses promise?如何从本身使用promise的函数返回promise?
【发布时间】:2016-09-29 21:01:14
【问题描述】:

我想做的基本上是

function test() {
getSomeValue().then(function (data) {
    //process data
});
}

function getSomeValue() {
//do some long process 
return new Promise(function (resolve, reject) {
    resolve(result);
});
}

function getSomeOtherValue() {
//do some long process 
return new Promise(function (resolve, reject) {
    resolve(result);
});
}

函数测试调用一个返回promise的函数,然后对返回的数据执行一些计算。这部分工作正常。现在函数getSomeValue 需要调用另一个同样返回promise 的函数。如何从 getSomeValue 返回一个承诺,该承诺也等待 getSomeOtherValue 完成。

如果需要任何其他信息,请告诉我。

【问题讨论】:

  • 你可以做链接,.then().then()....

标签: javascript node.js promise


【解决方案1】:

要在getSomeValue之前从getSomeOtherValue中获取值,只需先调用getSomeOtherValue函数,然后与另一个函数链接处理getSomeValue的值,最后将结果返回给调用者(测试函数)

function getSomeValue() {
  //do some long process 
  return getSomeOtherValue().then(function(resultFromSomeOtherValue) {
    return new Promise(function (resolve, reject) {
      var result = true; //some value after process;
      return resolve(result);
    });
  });
}

【讨论】:

  • 补充说明
【解决方案2】:

您可以将getSomeOtherValue 链接到getSomeValue

function getSomeValue() {
    //do some long process 
    return new Promise(function (resolve, reject) {
        resolve(result);
    }).then(getSomeOtherValue);
}

如果你想切换顺序,那么:

function getSomeValue() {
    //do some long process 
    return getSomeOtherValue().then(function () {
        return new Promise(function (resolve, reject) {
            resolve(result);
        });        
    }
}

但是,这仅用于说明。你可以设计你的 Promise,这样你就可以在更高的层次上有效地链接它们:

function test() {
    getSomeOtherValue()
        .then(getSomeValue)
        .then(function (data) {
            //process data
        });
}

【讨论】:

  • 其实getSomeOtherValue()需要先调用。我需要来自 getSomeOtherValue() 的数据,然后根据该数据生成响应
【解决方案3】:

要等待getSomeOtherValue函数被解析,你需要在getSomeOtherValue函数返回的promise中解析getSomeValue函数的promise。下面的代码应该是有意义的

function test() {
getSomeValue().then(function (data) {
    //process data
});
}

function getSomeValue() {
//do some long process 
return new Promise(function (resolve, reject) {
  getSomeOtherValue().then(function (data) {
      resolve(result);
  });        
});
}

function getSomeOtherValue() {
//do some long process 
return new Promise(function (resolve, reject) {
    resolve(result);
});
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 2020-03-28
    • 2021-05-03
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2023-03-08
    • 2018-12-14
    相关资源
    最近更新 更多