返回一个取决于JS函数的异步调用的值

时间:2018-05-18 22:03:44

标签: javascript asynchronous callback

这里的关键是我希望我的函数返回我从另一个函数异步接收的值。 结构如下:

const https = require('https');

function getNumPages(substr) {
    let totalPages = 0;
    console.log(`Before makeRequest ${totalPages}`); //0

    makeRequest(substr,(numPages)=>{
        console.log(`Inside callback from makeRequest${numPages}`); //79

        totalPages = numPages;
    });

    console.log(`After makeRequest${totalPages}`); //0
    return totalPages;
}

让getNumPages 返回来自makeRequest的值的最佳方法是什么? 我理解代码的异步性质,并且在makeRequest函数调用其回调之前执行返回值。

我希望能够使用字符串调用getNumPages,比如getNumPages('Shakespeare'),makeRequest将调用API,获取数据库中莎士比亚的页数,然后getNumPages返回整数。 我知道在makeRequest的回调中我有适当数量的页面,但是说我不想在那里工作,我只想从getNumPages返回它。

2 个答案:

答案 0 :(得分:0)

只是回复一个承诺,这是唯一的方式。

但是......您可以使用async / await使其看起来像一个同步代码 无论如何,它只会使用引擎盖下的承诺。但它的外观和行为就像你想要的那样(我认为)

答案 1 :(得分:0)

您可以使用async/await语法

function checkData() {

  console.log('checking image size...');

  var img = new Image();
  var images = document.getElementsByName('img');
  var ctx = document.getElementById('canvas').getContext('2d');

  img.onload = function() {

    if (img.width != 385 || img.height != 345) {
      console.log("Wrong size: " + img.width + " X " + img.height);
    } else {
      ctx.drawImage(this, 20, 20);
      console.log("The image is drawn.");
    }

  }

  img.onerror = function(e) {
    console.log("Not ok", e);
  }

  img.src = URL.createObjectURL(images[0].files[0]);

}

var myform = document.getElementById('myform');
myform.addEventListener('submit', function(e) {
  e.preventDefault();
  checkData();
});