bugfix> javascript > 投稿

私はこのようなコードを持っています

function hello(){
     setTimeout(() => console.log("after 3sec"), 3000);
 }
  let x = Promise.resolve()
  x.then(() => {
  hello()
  }).then(() => console.log("after 1st then"))

今、出力は奇妙です、2番目の関数のconsole.logは、1番目のconsole.logの前に実行されています..それを同期させる方法、つまり、2番目の .then と言うことができます最初の .then の後にのみ実行する必要があります

回答 1 件
  • setTimeout  それ自体はPromiseを返しません-コールバックベースです。 Promiseチェーンでコールバックベースの関数を使用する場合は、明示的にPromiseに変換する必要があります。

    let x = Promise.resolve()
    x.then(() => {
      return new Promise(resolve => {
        setTimeout(() => {
          console.log("after 500ms");
          resolve();
        }, 500);
      });
    }).then(() => console.log("after 1st then"))
    
    

    新しい質問については、 hello を作成する必要があります  Promiseを返し、次に hello を返します  呼び出して、連鎖できるようにします。

    function hello() {
      return new Promise(resolve => {
        setTimeout(() => {
          console.log("after 500ms");
          resolve();
        }, 500);
      });
    }
    let x = Promise.resolve()
    x.then(() => {
      return hello()
    }).then(() => console.log("after 1st then"))
    
    

あなたの答え