2017-11-28 7 views
0

私はmongoose約束の配列を渡しています。何らかの理由でcustomerFindPromiseがnullを返すこともありますが、時には要求されたオブジェクトを返すこともあります。私はここで何か間違ったことをやっているnodejs Promise.allはいくつかのマングース約束でnullを返します

******************** START result0: null result END ******************** 
******************** START result1: { _id: 5a18a637346826574416a588, 
doc_fname: 'Bob', 
doc_lname: 'Smith', 
numOfCases: 1, 
__v: 0 } result END ******************** 
******************** START result2: {"n":1,"ok":1} result END ******************** 

コード

var customer = { 
    doctor_id: 5a18a637346826574416a588, 
    cust_fname: 'dfsdf', 
    cust_lname: 'sdasd', 
    case_type: 'Crowns', 
    _id: 5a1cd19438f14164b0087753 
} 
test(customerCase); 
async function test(customerCase) { 

    console.log("******************** customerCaseDelete: "+ customerCase._id +" ********************"); 
    var _id = customerCase._id; 
    var doctor_id = customerCase.doctor_id; 
    var query = {_id:_id}; 

    const customerFindPromise = CustomerCases.findById(_id); 
    const customerRemovePromise = CustomerCases.remove(query); 
    const doctorUpdatePromise = Doctors.findOneAndUpdate({_id:doctor_id},{'$inc': {'numOfCases': -1}},{new:true}); 

    await Promise.all([customerFindPromise,doctorUpdatePromise,customerRemovePromise]) 
     .then((result) => { 
     console.log("******************** START result0: "+ result[0] +" result END ********************"); 
     console.log("******************** START result1: "+ result[1] +" result END ********************"); 
     console.log("******************** START result2: "+ result[2] +" result END ********************"); 
     res.json(result); 
     }).catch((err) => { 
      console.log("******************** START err: "+ err +" err END ********************"); 
     throw err; 
     }); 
} 
+0

あなたのコードは無効です。特に、 'var customer'の宣言は無効です。 –

+0

同じIDを持つオブジェクトを同時に見つけて削除するのは、古典的な競合状態のようです。 – Bergi

答えて

0

あなたが実行している関数は非同期であり、常に順番に実行されません。 Promise.allは、プロミスの実行順序を変更しません。すべてのプロンプトが解決されるのを待つだけです。

時々CustomerCases.removeが実行され、CustomerCases.findByIdより前に解決されるので、ドキュメントが最初に削除されたときにnullが解決されます。約束は、次のクエリを実行する前に、シリアル解決するための

待ち、あなたはasync/awaitを使用していると見て、それを追加するために非常に単純です:

try{ 
    let find = await CustomerCases.findById(_id) 
    console.log(`find: ${find}`) 
    let update = await CustomerCases.remove(query) 
    console.log(`update: ${update}`) 
    let remove = await Doctors.findOneAndUpdate({_id:doctor_id},{'$inc': {'numOfCases': -1}},{new:true}) 
    console.log(`remove: ${update}`) 
    res.json([find, update, remove]) 
} catch(err) { 
    console.error(err) 
    throw err // next(err)? 
} 

するTry青い鳥Promise.eachあなたは、シリアル実行ヘルパーが必要な場合。

+0

Promiseは実行されず、 'Promise.all'には「実行」がありません。 – Bergi

+0

@Bergiより良い用語? – Matt

+0

ありがとう@マット、私はそれがすべての約束を同時に実行しない約束を待つことを追加することによって考えた。 Promise.allを追加するために遠くにあり、この状況のた​​めに必要です。 – publicArt33

関連する問題