【问题标题】:Accessing the result of a returned promise [duplicate]访问返回的承诺的结果[重复]
【发布时间】:2018-05-21 02:30:11
【问题描述】:

我试图更好地理解 Promise,并实现了基本上如下所示的代码:

console.log(getRemoteData())

function getRemoteData (){
  return fetch('http://w.x.y.z')
  .then(response => {
    return response.json();
  });
}

假设 getRemoteData() 返回一个承诺,我如何访问该响应的值?我试图在登录到控制台之前解决承诺,除了记录承诺 obj 之外,我无法让它做任何事情。我认为我错过了 Promise 工作方式的一个基本组成部分。

我已经尝试搜索 SO,我找到的所有答案都指向 .then() 方法中的 //do something with the returned data 评论,但我想从那里了解我应该做什么。返回值为array[]

【问题讨论】:

    标签: javascript ecmascript-6 es6-promise fetch-api


    【解决方案1】:

    fetch(...) 返回一个承诺,response.json() 返回另一个承诺。

    返回的值不是一个数组,而是一个数组的promise。应该是:

    getRemoteData().then(result => {
      console.log(result);
    });
    

    结构可以像async 函数(ES2017)中的同步代码一样扁平化。它们是 promise 的语法糖,这个 sn-p 等于前一个:

    (async () => {
        const result = await getRemoteData();
        console.log(result);
    })();
    

    【讨论】:

    • 啊,这非常有用,谢谢!有什么原因我不能 return result 到外部 console.log() 调用而不是在返回的承诺中这样做?
    • 因为getRemoteData是异步的,调用的时候没有结果。有关一些想法,请参阅stackoverflow.com/questions/14220321/…,它涵盖了很多内容,包括 Promise。
    • 感谢您的澄清!
    • 不客气。
    【解决方案2】:

    如果您仍在使用 ES2015,请使用 co

    var co = require('co');
    
    co(function *(){
        // yield any promise
        var result = yield getRemoteData();
    }).catch(onerror);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-07
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 2013-12-08
      • 1970-01-01
      • 2015-11-04
      相关资源
      最近更新 更多