【问题标题】:making a .then() function return a promise to be used by another function [duplicate]使 .then() 函数返回一个由另一个函数使用的承诺 [重复]
【发布时间】:2018-04-30 03:07:18
【问题描述】:

我正在使用这个原生脚本 firebase 插件,这让我使用了这个功能:

getValue() {
     var value;
     firebase.getValue('/companies')
         .then(result => {
             console.log(JSON.stringify(result));
             value = result;
             return result;

         })
         .catch(error => {
             console.log("Error: " + error);
             return error;
         });
     return value;
 }

如果我将它导入另一个文件并像这样使用它:

var myValue = this.myFirebaseService.getValue();

如果我第一次运行它返回 undefined 但第二次返回值。

我的问题是如何让 firebase 函数返回一个承诺,以便我可以让我的第二个语句等待它。

【问题讨论】:

  • 如果您的环境支持,请使用 aync/await
  • firebase.getValue() 已经返回 Promise。你没有做的是从getValue()返回那个承诺。

标签: javascript angular typescript promise


【解决方案1】:

您所指的 firebase 函数正在返回一个承诺。这就是为什么您可以在调用 getValue 函数后使用.then.catch

如果你从 getValue() 返回 firebase 承诺,像这样:

getValue(){
  return firebase.getValue('/companies');
}

您可以随时调用getValue(),但您必须在getValue()(这是一个承诺)解决后执行代码。像这样:

getValue().then(function(value) {
  console.log(value);
});

如果你不明白,我会阅读承诺:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

【讨论】:

    【解决方案2】:

    您可以在收到来自then 块的结果后初始化myValue

    类似这样的:

    var myValue;
    
    function getValue() {
      return firebase.getValue('/companies');
    }
    
    myValue = getValue().then(result => {
        const value = JSON.stringify(result);
        console.log(value);
        return value;
      })
      .catch(error => {
        console.log("Error: " + error);
      });
    }

    【讨论】:

    • 谢谢...但是如果我想在另一个文件中使用它怎么办。假设我想将此函数导入另一个文件并使用它返回的值
    • 一定要导入第二个文件,这样then中调用的函数就不会返回未定义的;)
    • 您的 function getValue() { 没有返回承诺,因此 myValue = 将始终未定义。可能想更新你的答案...return firebase.getValue(...
    • 这很难看。为什么不直接使用返回的 promise 并在链中的 next then() 中设置变量值?
    • 返回后如何调用init()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多