Javascript 异步函数在使用promise后不等待
我正在使用JS制作一个chrome扩展。函数chrome.history.search是一个异步回调函数。由于它是异步的,我计划使用promise使它同步。我希望代码使用chrome.history.search将值分配给url,然后将其推送到全局数组lastEpisodeLink。还有另一个函数findLastEpisodeLink,它在多个标题上调用findLastEpisode_helper 我需要的输出序列是:Javascript 异步函数在使用promise后不等待,javascript,asynchronous,google-chrome-extension,promise,callback,Javascript,Asynchronous,Google Chrome Extension,Promise,Callback,我正在使用JS制作一个chrome扩展。函数chrome.history.search是一个异步回调函数。由于它是异步的,我计划使用promise使它同步。我希望代码使用chrome.history.search将值分配给url,然后将其推送到全局数组lastEpisodeLink。还有另一个函数findLastEpisodeLink,它在多个标题上调用findLastEpisode_helper 我需要的输出序列是: 开始 在…内 成功, 开始 在…内 成功 但我得到的是: 开始,开始,内在,
开始 在…内 成功,
开始 在…内 成功 但我得到的是:
开始,开始,内在,成功,内在,成功 当我在函数运行后检查数组lastEpisodeLink时,它显示为空,不应该为空。如何解决此问题? 是的,我遵循了答案,但仍然没有解决它。如果你能帮我修复这段代码,那将非常有帮助。多谢各位
function findLastEpisodeLink_helper(title) {
console.log("start");
var url;
function onSuccess () {
console.log('Success!');
lastEpisodeLink.push(url);
}
var promise = new Promise(function(resolve, reject) {
chrome.history.search(
{
'text': title,
'maxResults': 1,
'startTime': 0
},
function(historyItems) {
console.log("inside");
url = historyItems[0]["url"];
resolve();
});
});
promise.then(onSuccess);
}
调用它的函数
function findLastEpisodeLinks() {
for(title in stringArray) { //psudo code
findLastEpisodeLink_helper(title);
}
}
调用它的函数如下所示,它本身就是一个异步回调,所有调用都是由它在这里完成的
chrome.history.search(
{
'text': '',
'maxResults': 10000,
'startTime': 0
},
function(historyItems) {
var allHistoryText = [];
var allHistoryUrl = [];
for(var i=0; i<historyItems.length; i++) {
allHistoryText.push(historyItems[i]["title"]);
allHistoryUrl.push(historyItems[i]["url"]);
}
// some functions
findLastEpisodeLinks();
displayAll(finalAllSeries);
});
chrome.history.search(
{
“文本”:“,
“maxResults”:10000,
“开始时间”:0
},
函数(历史项){
var allHistoryText=[];
var allHistoryUrl=[];
对于(var i=0;i这就是我要做的事情
const lastEpisodeLink = [];
function findLastEpisodeLink_helper(title) {
return new Promise(function(resolve) {
chrome.history.search({
'text': title,
'maxResults': 1,
'startTime': 0
},function(historyItems) {
var url = historyItems[0]["url"];
lastEpisodeLink.push(url);
resolve();
});
});
}
async function findLastEpisodeLinks() {
for(var title in stringArray) {
await findLastEpisodeLink_helper(title);
}
}
使用现代的async
+wait
语法和Promise。所有:
函数搜索(标题){
返回新承诺(解决=>{
chrome.history.search({
“文本”:标题,
“maxResults”:1,
“开始时间”:0,
},results=>resolve(结果[0].url));
});
}
异步函数findLastEpisodeLinks(标题){
const results=wait Promise.all(titles.map(search));
控制台日志(结果);
}
用法:findLastEpisodeLinks(['text a'、'text b'、'text c'])
我认为您的主要问题是如何保持for循环中异步函数调用的顺序。为此,您只需等待findLastEpisodeLink\u helper
,以便循环等待其承诺得到解决
async function findLastEpisodeLink_helper(title) {
console.log('start');
var url;
function onSuccess() {
console.log('Success!');
lastEpisodeLink.push(url);
}
await new Promise(function (resolve, reject) {
chrome.history.search(
{
text: title,
maxResults: 1,
startTime: 0,
},
function (historyItems) {
console.log('inside');
url = historyItems[0]['url'];
resolve();
},
);
});
onSuccess();
}
async function findLastEpisodeLinks() {
for (title in stringArray) {
//psudo code
await findLastEpisodeLink_helper(title);
}
}
承诺是异步的。您认为使用承诺会使其同步吗?我如何解决这个问题,您能否帮助您在resolve中传递url,并且在onsuccess中可以访问url。这将解决空数组的问题。是的,这确实会填充数组,但它由对象承诺{fulfield}填充我尝试了代码,但没有解决问题。数组仍然是空的。确定这是我浏览您的代码的主要链接,您可以在之前添加控制台。log
for(FinallSeries中的var obj){
insidefindLastEpisodeLinks
函数,查看在for循环执行之前打印了什么?如果当时填充了数组finalAllSeries
。另外,您需要在findLastEpisodeLinks()之前添加async
;第97行中的。请阅读有关async wait的工作原理。此循环for(最终系列中的var obj)
工作正常,我可以向您保证。我不能在第97行中添加async或Waits,它表示未捕获的SyntaxError:意外识别使用第97行中的swait表示错误Waits仅对async函数有效,嘿,我尝试了您的代码,问题仍然存在,数组大小为0。指向code@swasticsing的链接表明您没有等待e> findLastEpisodeLinks
函数。您在运行代码时会立即将其记录下来。我尝试过,但不知怎的,它说Wait仅对异步函数有效,代码是完全相同的。@SwastikSingh您需要用异步函数(将其命名为init
或main
)并在其内部使用wait。而且,别忘了调用它)