JavaScript无法兑现承诺

时间:2018-11-27 08:57:57

标签: javascript promise fetch

我有两个职能。与function1()相比,function2()花费的时间更多,因为它会执行获取请求。我需要按此顺序启动它们,但是function2()的结果是第一个显示在HTML DOM上的结果。因此,我尝试使用promises解决此问题。我将第一个函数设为变量,并创建了以下代码:

let promise1 = function1() {
  fetch()
   .then(do x)
   .then(display x to HTML DOM)
  return 0;
};

function2(a) {
  // use the a;
  // display some things to the HTML DOM based on `a`
}

promise1.then((a) => {
      function2(a);
    });

最初,这两个功能不需要相互交互,但是为了使此功能与Promise一起工作,我使用了return语句来创建人为的需求。但是,这不起作用:我收到TypeError: promise1.then is not a function错误。我浏览了“ Learn more”网页,但这些情况不适用于此处。

我对JS很陌生,对诺言很陌生。我想念什么吗?

2 个答案:

答案 0 :(得分:1)

要解决此问题,您需要确保function1返回一个Promise对象。

通过返回一个promise对象,这使您可以在尝试进行操作时从该函数的调用(即.then())“链接”后续的promise1处理程序。

因此,在遇到特定问题时,您需要执行以下操作:

let promise1 = function1() {
    return fetch('/some/url').then(function (response){
        // Do response processing logic here
        return response; 
    }).then(function (data)  {
       //Chain any other data/response processing
       return data;
    });
};

这里要记住的关键是将调用返回到fetch,以及将每个then处理程序中的数据返回到链接到访存的调用上。

希望有帮助!

答案 1 :(得分:1)

您只需要在第一个代码块中返回从fetch返回的promise:

let promise1 = function1() {
  return fetch()
   .then(do x)
   .then(() => {
        //returns also need to be async
        return 0;
    });

  //don't do this
  // return 0;
  // return inside the then() above
};

function2(a) {
  // use the a;
  // display some things to the HTML DOM based on `a`
}

promise1.then((a) => {
      function2(a);
    });

对此进行更详细的解释;您的fetch异步运行。因此,任何后续功能都不会等待(阻止)。 fetch返回一个Promise,当异步功能完成时,该链接可让您链接后续功能。因此,要在fetch之后运行任何内容,都需要消耗Promise返回的fetchthenPromise对象的函数,不是获取自身,而是消耗承诺(在promise对象上调用then),您需要先将其返回,因此return fetch()...How do I return the response from an asynchronous call?详细介绍了