2つのチェーン非同期関数内および別のループ内で非同期関数をループします

nyx97

3つの非同期関数がloop1でラップされています。最初の2つの非同期関数は、最初の2つの関数のそれぞれが正常に実行された後にチェーンされ、最後の非同期関数は別のループでラップされます。これが問題になります。ループは、3番目の非同期関数が実行されて値を返すのを待たずに、再度ループします。

プロバイダーを呼び出すtsコード、これはループ1です

for(var i=0; i<maxValue; i++){
    if(this.loanSteps.length > i){
       this.localdb.insertStepsToApply(this.loanSteps[i]);
      }
    }

プロバイダー機能コード

  insertStepsToApply(stepsValue){
    return this.sqlite.create({
      name: 'govservices.db',
      location: 'default'
    }).then((db: SQLiteObject) => {
      return db.executeSql('INSERT INTO application_steps(steps_program_refer_id,steps) VALUES ('+this.governmentprogram_id+',"'+stepsValue+'")',[])
      .then(res=>{
        console.log('inserted steps');   
        return db.executeSql('SELECT * FROM application_steps ORDER by appsteps_id DESC LIMIT 1', [])
        .then(async res=>{
          if(res.rows.length > 0){
              this.applyStepsid = res.rows.item(0).appsteps_id;
              console.log('extracting app steps id ->'+this.applyStepsid);
              var steplength = stepsValue.split(/\r\n|\r|\n/).length; // new line
              var stepLengthblankspace = (stepsValue.match(/^[ \t]*$/gm) || []).length; // blank spaces
              var numberOfSentences = steplength - stepLengthblankspace;

              for(var ix=0; ix < numberOfSentences; ix++){
                await db.executeSql('INSERT INTO requirement_list(requirement_government_program_id, requirement_steps_id) VALUES ('+this.governmentprogram_id+','+this.applyStepsid+')',[])
                .then(res =>{
                  alert('successfully inserted to steps apply requiermeent box');
                    return res;
                  }).catch(e =>{
                    console.log(e.message); 
                  });
              }
          }
        }).catch(e => console.log(e.message));
      }).catch(e => console.log(e.message));
    }).catch(e => console.log(e.message));
  }

内側のループは、steps値が持つ文の数に依存することに注意してください。このstepvalueはテキストボックスであり、必要な出力が次のような段落を持っています。

inserted steps
extracting app steps id -> 3
successfully inserted to steps apply requirement box
successfully inserted to steps apply requirement box
successfully inserted to steps apply requirement box
inserted steps
extracting app steps id -> 4
successfully inserted to steps apply requirement box
successfully inserted to steps apply requirement box

でも実際はこんな感じ

inserted steps
extracting app steps id -> 3
inserted steps
extracting app steps id -> 4
successfully inserted to steps apply requirement box
successfully inserted to steps apply requirement box
successfully inserted to steps apply requirement box
successfully inserted to steps apply requirement box
successfully inserted to steps apply requirement box

私はまた、内側のループ(loop2)の外側にpromiseを置きますが、それでも出力は正しくありません。このようなものを処理する方法について何か考えはありますか?

nyx97

@Kokodokoが提案したように私の問題を解決し、このようなものに別の関数を作成します

    return db.executeSql('SELECT * FROM application_steps ORDER by appsteps_id DESC LIMIT 1', [])
    .then(async res=>{
      if(res.rows.length > 0){
          this.applyStepsid = res.rows.item(0).appsteps_id;
          console.log('extracting app steps id ->'+this.applyStepsid);
          var steplength = stepsValue.split(/\r\n|\r|\n/).length; // new line
          var stepLengthblankspace = (stepsValue.match(/^[ \t]*$/gm) || []).length; // blank spaces
          var numberOfSentences = steplength - stepLengthblankspace;
          console.log('total sentences '+numberOfSentences+' = '+steplength+' - '+stepLengthblankspace);
          for(var ix=0; ix < numberOfSentences; ix++){
            await this.insertIntoRequirementCheckbox();
          }
      }
    }).catch(e => console.log(e.message));

insertIntoRequirementCheckbox(){
return this.sqlite.create({
  name: 'govservices.db',
  location: 'default'
}).then((db: SQLiteObject) =>{
  return db.executeSql('INSERT INTO requirement_list(requirement_government_program_id, requirement_steps_id) VALUES ('+this.governmentprogram_id+','+this.applyStepsid+')',[])
  .then(res =>{
    console.log('requirement checkbox successfully inserted');
    }).catch(e => console.log(e.message));
  }).catch(e => console.log(e.message));
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JavaScriptのforループ内で非同期関数を呼び出す

分類Dev

setTimeout内のinsertManyおよび非同期関数を使用したforループ

分類Dev

別の非同期関数内の非同期関数を介して配列をループする方法は?

分類Dev

ループ内の非同期関数の階層を呼び出しますか?

分類Dev

forループ内の非同期関数

分類Dev

ループ内のJS非同期関数

分類Dev

forEach ループ内の非同期関数

分類Dev

$ .eachループ内の関数呼び出し、それは非同期ですか、それとも同期ですか?

分類Dev

forループ内の非同期関数を連続して実行する

分類Dev

非同期フェッチ関数を使用した無限ループでのuseEffect

分類Dev

TypeScriptを使用して同期関数内で非同期操作のループが終了するのを待つことはできますか?

分類Dev

ループ内の非同期関数の完了後に関数を呼び出す方法は?

分類Dev

ループ内の複数の(並列)非同期関数呼び出しの累積結果を返すにはどうすればよいですか?

分類Dev

ループ内のfirebaseクラウド関数の非同期呼び出しから結果を収集する

分類Dev

ループ内の非同期関数の最後の値

分類Dev

複数の非同期呼び出しを伴うForループ-2番目の非同期関数の最後の項目を繰り返し出力します

分類Dev

スコープ内で非同期関数のリターンを使用する方法

分類Dev

Node.js:非同期関数はforループ内でPromiseの解決を待たないようです

分類Dev

forループで非同期関数を待機しています

分類Dev

javascriptで配列ループの非同期関数を作成しますか?

分類Dev

ループ非同期のFirebase関数が待機します

分類Dev

非同期関数内またはpromise内でグローバル変数の値を設定しますか?

分類Dev

redux-thunkで別の非同期関数内で1つの非同期関数を呼び出す

分類Dev

このループ内の別の関数内にある非同期コード内のループの終わりを検出する

分類Dev

コールバック値を取得し、別の非同期関数内で使用する

分類Dev

イテレータ関数内で終了したすべてのタスクのノード、非同期、およびコールバック

分類Dev

forEachループ内の非同期関数とコールバック

分類Dev

ビュー内の関数を非同期関数に変換します。django / python

分類Dev

Promiseチェーンの2つの関数が非同期的に呼び出されています

Related 関連記事

  1. 1

    JavaScriptのforループ内で非同期関数を呼び出す

  2. 2

    setTimeout内のinsertManyおよび非同期関数を使用したforループ

  3. 3

    別の非同期関数内の非同期関数を介して配列をループする方法は?

  4. 4

    ループ内の非同期関数の階層を呼び出しますか?

  5. 5

    forループ内の非同期関数

  6. 6

    ループ内のJS非同期関数

  7. 7

    forEach ループ内の非同期関数

  8. 8

    $ .eachループ内の関数呼び出し、それは非同期ですか、それとも同期ですか?

  9. 9

    forループ内の非同期関数を連続して実行する

  10. 10

    非同期フェッチ関数を使用した無限ループでのuseEffect

  11. 11

    TypeScriptを使用して同期関数内で非同期操作のループが終了するのを待つことはできますか?

  12. 12

    ループ内の非同期関数の完了後に関数を呼び出す方法は?

  13. 13

    ループ内の複数の(並列)非同期関数呼び出しの累積結果を返すにはどうすればよいですか?

  14. 14

    ループ内のfirebaseクラウド関数の非同期呼び出しから結果を収集する

  15. 15

    ループ内の非同期関数の最後の値

  16. 16

    複数の非同期呼び出しを伴うForループ-2番目の非同期関数の最後の項目を繰り返し出力します

  17. 17

    スコープ内で非同期関数のリターンを使用する方法

  18. 18

    Node.js:非同期関数はforループ内でPromiseの解決を待たないようです

  19. 19

    forループで非同期関数を待機しています

  20. 20

    javascriptで配列ループの非同期関数を作成しますか?

  21. 21

    ループ非同期のFirebase関数が待機します

  22. 22

    非同期関数内またはpromise内でグローバル変数の値を設定しますか?

  23. 23

    redux-thunkで別の非同期関数内で1つの非同期関数を呼び出す

  24. 24

    このループ内の別の関数内にある非同期コード内のループの終わりを検出する

  25. 25

    コールバック値を取得し、別の非同期関数内で使用する

  26. 26

    イテレータ関数内で終了したすべてのタスクのノード、非同期、およびコールバック

  27. 27

    forEachループ内の非同期関数とコールバック

  28. 28

    ビュー内の関数を非同期関数に変換します。django / python

  29. 29

    Promiseチェーンの2つの関数が非同期的に呼び出されています

ホットタグ

アーカイブ