未承诺(承诺)是什么意思?

时间:2019-09-02 02:46:11

标签: javascript promise

我试图了解Promise是什么,所以我开始了following this guide

我从指南中复制了此代码,并在开发人员控制台中对其进行了尝试:

var promise = new Promise(function(resolve, reject) {
  // do a thing, possibly async, then…

  if (false) {
    resolve("Stuff worked!");
  }
  else {
    reject(Error("It broke"));
  }
});

我收到一个错误,说Uncaught (in promise) Error: It broke。我不明白这是什么意思。谁能解释?

2 个答案:

答案 0 :(得分:4)

一个承诺可以被解决或被拒绝。如果是/何时解决,则将调用任何then函数。如果拒绝,则将调用任何catch函数。如果您不提供任何catch函数,则promise可能会帮助打印该警告。

function test(fail) {
  return new Promise((resolve, reject) => {
    if (fail) {
      reject();
    } else {
      resolve();
    }
  });
}

// will print rejected 1
test(true)
  .then(() => { console.log('resolved 1'); })
  .catch(() => { console.log('rejected 1'); })

// might generate the error telling you the promise
// was rejected but you didn't provide a catch function
test(true)
  .then(() => { console.log('resolved 2'); })

请注意,该消息是浏览器/ JavaScript引擎的有用警告。您不必遵守已拒绝的承诺,但通常您希望这样做,因此该消息很有帮助。

详细信息

重要的是要注意诺言如何运作。当您调用then(someFunc)时,它们实际上将someFunc放在以后要调用的函数列表中。如果诺言已经兑现,他们将调用列表中的每个函数并清除列表。如果诺言没有兑现,他们将无所作为。 catch相同,只是列表不同。

这是一个例子

function makePromiseParts() {
  let resolve;
  let reject;
  const promise = new Promise((_resolve, _reject) => {
    log('--in promise--');
    resolve = _resolve;
    reject = _reject;
  });
  return {
    promise,
    resolve,
    reject,
  };
}

function wait() {
  return new Promise(resolve => setTimeout(resolve));
}

async function main() {
  {
    log('--start--');
    
    const p = makePromiseParts();
    
    log('--after make promise--');

    p.promise.then(() => { log('then 1'); });
    p.promise.then(() => { log('then 2'); });

    log('--before resolve--');

    p.resolve();

    log('--after resolve--');
    
    await wait();

    log('--after waiting--');

    p.promise.then(() => { log('then 3'); });
    p.promise.then(() => { log('then 4'); });

    log('--before waiting--');
    
    await wait();

    log('--end--');
  }
  
  await wait();
  log(' ');

  {
    log('--start--');
  
    const p = makePromiseParts();

    log('--after make promise--');

    p.promise.catch(() => { log('catch 1'); });
    p.promise.catch(() => { log('catch 2'); });

    log('--before reject--');

    p.reject();

    log('--after reject--');
    
    await wait();

    log('--after waiting--');

    p.promise.catch(() => { log('catch 3'); });
    p.promise.catch(() => { log('catch 4'); });

    log('--before waiting--');
    
    await wait();

    log('--end--');
  }

}
main();

function log(...args) {
  const elem = document.createElement('pre');
  elem.textContent = [...args].join(' ');
  document.body.appendChild(elem);
}
pre { margin: 0; }

换句话说,then采用表示call this function if and when you're resolved的函数,而catch采用表示call this function if and when you're rejected的函数。

答案 1 :(得分:4)

这意味着您的Promise抛出了一个未被发现的错误。

即您没有按承诺调用.catch()。

在您的情况下,if(false)永远不会评估为真实,因此您的承诺会被拒绝。