我有两个职能。与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很陌生,对诺言很陌生。我想念什么吗?
答案 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
返回的fetch
。 then
是Promise
对象的函数,不是获取自身,而是消耗承诺(在promise对象上调用then
),您需要先将其返回,因此return fetch()...
。 How do I return the response from an asynchronous call?详细介绍了