Javascript 异步函数在使用promise后不等待

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 我需要的输出序列是: 开始 在…内 成功, 开始 在…内 成功 但我得到的是: 开始,开始,内在,

我正在使用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){
inside
findLastEpisodeLinks
函数,查看在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。而且,别忘了调用它)