LoginSignup
3
2

More than 1 year has passed since last update.

Promiseの使い方

Last updated at Posted at 2018-06-13

javascriptで非同期処理を順番通りに行う場合は、promiseを使うと分かりやすいです。

main.js
//本来やりたいことの一例

//表示
showMessage("処理1開始");  

//処理1
for(int i=0;i<99;i++){

  showMessage("処理中 " + i);  //表示が更新されない

  shori_1(i);
}

//表示
showMessage("処理2開始");  

//処理2
for(int i=0;i<99;i++){

  showMessage("処理中 " + i);  //表示が更新されない

  shori_2(i);
}

上記のサンプルで動作してくれれば問題ないのですが、表示は更新されません。
そこで、下記の様に処理と表示の処理をそれぞれ独立して(非同期で)処理します。
因みに並列処理ではありません(javascriptでは、非同期処理≠並列処理です)。

まとめて書く

まとめて書くとこの様な感じ。
このままでは使用できません(意図した動作になりません)。

main.js
var promise =    new Promise((resolve, reject) => { console.log("shori1") })
.then((value) => new Promise((resolve, reject) => { console.log("shori2") }))
.then((value) => new Promise((resolve, reject) => { console.log("shori3") }))
.then((value) => new Promise((resolve, reject) => { console.log("shori4") }))
.then((value) => new Promise((resolve, reject) => { console.log("shori5") }))
.then((value) => { console.log("shori6") })
.catch((error) => { console.log("shoriError") });

値の受け渡し

値の受け渡しは、この様に行います。
rejectすると、直接catchに飛びます。
このままでは使用できません(意図した動作になりません)。

main.js
var promise = new Promise((resolve, reject) => {

    resolve("para1");
    //reject("error1");

}).then((value) => new Promise((resolve, reject) => { 

    console.log(value);

    resolve("para2");
    //reject("error2");

})).then((value) => new Promise((resolve, reject) => { 

    console.log(value);

    resolve("para3");
    //reject("error3");

})).then((value) => new Promise((resolve, reject) => {

    console.log(value);

    resolve("para4");
    //reject("error4");

})).then((value) => new Promise((resolve, reject) => {

    console.log(value);

    resolve("para5");
    //reject("error5");

})).then((value) => {

    console.log(value);

    //resolve("para6");
    //reject("error6");

}).catch((error) => {

 console.log("error")

});

非同期処理を順番に行う(繰り返し処理なし)

実際に非同期処理を順番に行う場合は、下記の様に書きます。
※setTimeoutを追記します。
良く分からんけど。非同期処理の中に非同期処理を書く感じなのか。
alertやconfirmなどと文字表示などを組み合わせたい時などに使用できます。

main.js
var promise = new Promise((resolve, reject) => {

  window.setTimeout(() => {
    console.log("処理");
    resolve("para");
    //reject("error");
  }, 10)  //1-10?

}).then((value) => new Promise((resolve, reject) => { 

  console.log(value);

  window.setTimeout(() => {
    console.log("処理");
    resolve("para");
    //reject("error");
  }, 10)  //1-10?

})).then((value) => new Promise((resolve, reject) => { 

  console.log(value);

  window.setTimeout(() => {
    console.log("処理");
    resolve("para");
    //reject("error");
  }, 10)  //1-10?

})).then((value) => new Promise((resolve, reject) => {

  console.log(value);

  window.setTimeout(() => {
    console.log("処理");
    resolve("para");
    //reject("error");
  }, 10)  //1-10?

})).then((value) => new Promise((resolve, reject) => {

  console.log(value);

  window.setTimeout(() => {
    console.log("処理");
    resolve("para");
    //reject("error");
  }, 10)  //1-10?

})).then((value) => {

  console.log(value);

  window.setTimeout(() => {
    console.log("処理");
    resolve("para");
    //reject("error");
  }, 10)  //1-10?

}).catch((error) => {

 console.log("error")

});

非同期処理を順番に行う(繰り返し処理あり)

繰り返し処理で非同期処理を順番に行う場合は、下記の様に書きます。
※whileで囲んでやります。

main.js
var promise = new Promise((resolve, reject) => {

  var n = 0;

  while(true){
    window.setTimeout(() => {
      console.log("処理 " + n);
      if(n==99){
        resolve("para" + n);
        //reject("error" + n);
        break;
      }
      n++;
    }, 10)  //1-10?
  }

}).then((value) => new Promise((resolve, reject) => { 

  console.log(value);

  var n = 0;

  while(true){
    window.setTimeout(() => {
      console.log("処理 " + n);
      if(n==99){
        resolve("para" + n);
        //reject("error" + n);
        break;
      }
      n++;
    }, 10)  //1-10?
  }

})).then((value) => new Promise((resolve, reject) => { 

  console.log(value);

  var n = 0;

  while(true){
    window.setTimeout(() => {
      console.log("処理 " + n);
      if(n==99){
        resolve("para" + n);
        //reject("error" + n);
        break;
      }
      n++;
    }, 10)  //1-10?
  }

})).then((value) => new Promise((resolve, reject) => {

  console.log(value);


  var n = 0;

  while(true){
    window.setTimeout(() => {
      console.log("処理 " + n);
      if(n==99){
        resolve("para" + n);
        //reject("error" + n);
        break;
      }
      n++;
    }, 10)  //1-10?
  }

})).then((value) => new Promise((resolve, reject) => {

  console.log(value);

  var n = 0;

  while(true){
    window.setTimeout(() => {
      console.log("処理 " + n);
      if(n==99){
        resolve("para" + n);
        //reject("error" + n);
        break;
      }
      n++;
    }, 10)  //1-10?
  }

})).then((value) => {

  console.log(value);

  var n = 0;

  while(true){
    window.setTimeout(() => {
      console.log("処理 " + n);
      if(n==99){
        //resolve("para" + n);
        //reject("error" + n);
        break;
      }
      n++;
    }, 10)  //1-10?
  }

}).catch((error) => {

 console.log("error")

});
3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2