不调用.then方法时,Promise如何运行?

时间:2018-07-19 20:30:40

标签: javascript promise es6-promise

我创建了两个Promise,但是我没有对那些Promise运行then方法。但是,一旦Promise对象超出范围,Promise代码就会像调用.then一样运行。

如何在不调用Promise方法的情况下解决.then

我之所以问是因为我想用Promise对象加载一个数组,然后依次运行promise。

function promises_createThenRun() {
  const p1 = createPromise1();
  const p2 = createPromise2();

  console.log('before hello');
  alert('hello');
  console.log('after hello');
  // the two promises run at this point.  What makes them run?
}

function createPromise1() {
  let p1 = new Promise((resolve, reject) => {
    window.setTimeout(() => {
      console.log('timer 1');
      resolve();
    }, 2000);
  });
  return p1;
}

function createPromise2() {
  let p2 = new Promise((resolve, reject) => {
    window.setTimeout(() => {
      console.log('timer 2');
      resolve();
    }, 1000);
  });
  return p2;
}

3 个答案:

答案 0 :(得分:4)

Promise构造函数中的代码在创建promise时运行,并且同步运行,这使某些人感到惊讶。因此,即使没有then(),一切仍然可以运行。

new Promise(resolve => console.log("running"))

setTimeout的回调中的代码直到被调用后才运行,但即使没有then(),它也将运行

new Promise(resolve => {
  console.log("promise created")
  setTimeout(() => console.log("this runs later"), 1000)
})

答案 1 :(得分:3)

在致电.then时,您只需设置一个“回调”即可说出完成诺言后应该发生的情况。因此,无论是否声明此类回调,都会调用promise。

想象一下调用AJAX请求的Promise。调用.then并传递一个函数将使其在ajax调用完成时成功运行(是否成功,如超时或其他错误)。但是不调用.then不会停止请求的运行。您将不会对请求的结果做出任何反应。

答案 2 :(得分:0)

我认为,如果您不对他们进行呼叫/捕获/最后处理,那么“承诺将不会运行”。但是,如果您认为这些方法会返回新的Promises,并且根据您的逻辑,则需要对这些返回的Promises进行then / catch / finally调用才能“运行”它们,您将陷入无限循环)) )