不能使用promises命令js函数执行

时间:2017-10-16 08:19:47

标签: javascript html css json promise

基本上,我需要2个函数A和B才能从休息中获取数据,然后我想在成功获取数据后运行函数C

这是我的代码:

JS:

var A = function() {

  $.getJSON('linkA', function(data) {
    a = data.total;
    console.log("A : " + a);
  });

  return new Promise(function(resolve, reject) {
    resolve('Got a');
  });
};

var B = function() {

  $.getJSON('linkB', function(data) {
    b = data.total;
    console.log("B:" + b);
  });

  return new Promise(function(resolve, reject) {
    resolve('Got b');
  });
};

function run() {
  Promise.all([A(), B()]).then(function() {
    console.log("Got A and B")
  });
}

HTML:

<script>
run();
</script>

我希望结果应该在Console中:

A://数据

B://数据

得到A和B

然而,在其他两行之前我仍然有“得到A和B”。我想因为获取数据需要很长时间,因此程序首先编写“得到A和B”。但是必须有一些方法来实现目标吗?

2 个答案:

答案 0 :(得分:4)

你会立即解决这些承诺,而不是等到你收到数据后才能解决。

你也成了承诺创造反模式的牺牲品。 $.getJSON 已经为您提供了一个*,所以只需使用它并使用then转换数据(通过访问total):

var A = function() {
  return $.getJSON('linkA').then(function(data) {
    return data.total;
  });
};

B相同。然后,您的Promise.all代码就会生效,如果您调整它,您实际上可以获得ab

function run() {
  Promise.all([A(), B()]).then(function(results) {
    var a = results[0], b = results[1];
    // ...use `a` and `b`...
  });
}

或者,如果您可以依赖ES2015 +功能,您可以使用箭头功能和解构(或正常功能和解构,如果您愿意):

function run() {
  Promise.all([A(), B()]).then(([a, b]) => {
    // ...use `a` and `b`...
  });
}

由于你的其余代码只依赖于jQuery,而不是浏览器中的Promise支持,你也可以使用jQuery的$.when

function run() {
  $.when(A(), B()).then(function(a, b) {
    // ...use `a` and `b`...
  });
}

如果 您需要明确地执行new Promise(您不在此处)与不可用的API进行交互,它将如下所示:

// YOU DON'T NEED TO DO THIS WITH $.getJSON, but with non-thenable APIs you might
var A = function() {
  return new Promise(function(resolve, reject) {
    $.getJSON('linkA', function(data) {
      resolve(data.total);
    }).fail(function(jqXHR, textStatus, errorThrown) {
      reject(errorThrown || new Error(textStatus));
    });
  });
};

*“thatable” - 类似承诺的事情,请参阅the Promises/A+ spec

答案 1 :(得分:0)

var url = 'https://jsonplaceholder.typicode.com/posts/';

Promise.all( [url + 1, url + 2 ].map( $.get ) )
  .then(
   console.log
  )
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>