2016-11-22 10 views
1

私はJavaScript Promiseとpromise chainを浅く理解しています。 言うこと、私は以下のような方法があります。それは書かれて活字体であるが、JavaScript ES6関数からの約束を返す

ここ
private InsertPersonInDB(p : Person) {  
    return this.db.find({        //<- would this return? 
       selector: {objType: 'Person'}, 
       fields: ['_id'], 
       sort: ['_id'] 
      }).then(result => {       
       let allpersondIds : string[] = []; 
       (result.docs).forEach(rec => { 
        allpersondIds.push(rec._id); 
       }); 
       return allpersondIds;     
      }).then (allpersonIdsInDB => {     
       var id = this.getIdfromPersonName(person.personName, allpersonIdsInDB); 
       person._id = id; 
       return this.db.post(person)   //<- or would this return? 
      } 
} 

//Calling function 
for(let person of this.persons) { 
    InsertPersonInDB(person).then(result => { 
     console.log(result) 
     //Some UI updates  
    }).catch(err => { 
     console.log(err) 
     //Some UI updates notifying user about failure 
    }); 
} 

と一致するように変更することができ、私は2つのリターンを持って、最初の

リターンが見つけた

をthis.db.findされます関数は約束です

となりました。返り値

リターンthis.db.post(人)

でもポスト機能は約束です。ここで

、私はこの機能を実行すると、何が戻ってくる3つの質問

1)を持っていますか?

2)関数がすぐに約束を返す場合は、チェーンの場合はいつ実行されますか?

2)階層化されたアプリケーションで、プロミスチェーンをリファクタリングする優れた方法は何ですか。例えば。いくつかのチェーンを次には、サービスで実行する必要があります、他のUIで実行する必要があります、どのように私の約束コードを構成するのですか?

答えて

3

まず、あなた自身のための小さなサンプルを作成するだけで簡単にあなたの質問をテストできると思います。私は物事の仕組みがはっきりしていないので、何が起こるかを試してみるために小さな例を作ることは非常に便利です。同様に、この質問のためにそれを行うことができます(作業バージョンにもhttps://plnkr.co/edit/K18o4Lp2jtUincjyG5wi?p=previewを参照してください。結果を確認するには、コンソールを開いて!):

function test() { 
    return returnPromise().then((value) => { 
    console.log('1st then, inside test(): ' + value); 
    return 'Hello'; 
    }).then((value) => { 
    console.log('2nd then, inside test(): ' + value); 
    return 'world'; 
    }); 
} 

function returnPromise() { 
    return new Promise(function(resolve, reject) { 
    resolve('start of new Promise'); 
    }); 
} 

test().then((value) => { 
    console.log('3rd then, after calling test: ' + value); 
}); 

をご質問について:

  1. をあなたが一緒に約束を返しますすべての連鎖then関数。返されたPromiseに別のthenを追加すると、チェーンの最後に追加されます。それがtest().then(...)のときに表示されます。
  2. プロミスは、ある時点で、いつあなたに知らせることなく実行することを伝えます。 Promiseが解決すると、チェーンが実行されます。詳細はreturnPromiseでご覧になれます。ここで新しいPromiseを返します。プロミスの本体は、完了時にresolveメソッドを呼び出します(この場合は即座に実行されます)。プロミスに接続されているすべてのthenメソッドを解決して実行するようにプロミスをトリガします。通常Promiseは即座に解決することはできませんが、非同期タスク(たとえば、サーバーからデータを取得する)を先に実行します。
  3. これは本当にアプリケーションの種類と探しているものによって異なります。責任が明確に定義されている限り、現在のアプローチはそれ自体悪くはありません。
+0

私はあなたの議論を正しく理解しているかどうかわかりません。私はexecutorが 'function(resolve、reject)'部分だと思います。それはそこにreturn文がありません。 'resolve'メソッドだけを呼び出します。 – Sjoerd

+1

あなたが意味することがまだ分かっていないので、あなたはPlunkerの実例を与えることができますか? 'それで'連鎖したいなら、あなたはあなたの 'の中から新しい約束を返す。 MDNテキストでは、解決する新しいPromiseを作成するか、任意の値を返すことができます(自動的にPromiseでラップされ、解決されます)。返信文を残しておけば、「then」から「then」までの情報を渡すこともできません。 – Sjoerd

+0

うわー、私はあなたが「何らかの価値を返すことができることを知らなかった。それは自動的に約束に包まれ、あなたのために解決される」ということです。あなたは、絶対に正しい。私は混乱したコメントを削除します。 – ArneHugo

1

1)db.post(person)リクエストの結果を解決する約束。

2)db.post()呼び出しが応答を返すか、例外をスローすると、then(...)に渡されるコールバックが実行されます。

3)わかりません。私は一般的な答えはないと思う。これは、このサービスのユーザーに提供したいAPIによって異なります。

関連する問題