2017-07-31 5 views
-2

私はmap_of_uuid_ids_and_field_names_to_an_array_of_field_valuesを構築する必要があります。NodeJSのループからPromiseを返すにはどうすればよいですか?

ループがループした後にこのオブジェクトを返す必要があります。どうやって?

今、私のコードはこのループの内側でハングします。私はそれを見て、内側の "then()"ステートメントからの "return"ステートメントがないことに気付きました。しかし、コードをループする必要があるときに、どうすればそこにreturn文を置くことができますか?この内側のループからプロミスを返すにはどうすればいいですか?

function get_map_of_uuid_ids_and_field_names_to_an_array_of_field_values(string_from_api_call, api_key_whose_name_should_match_the_name_of_a_database_field) { 

    return new Promise(function(resolve, reject){ 

     var map_of_uuid_ids_and_field_names_to_an_array_of_field_values = {}; 
     sanitized_string_from_api_call = database_queries.sanitize_string(string_from_api_call); 


     // 2017-07-10 -- this fixes: 
     // TypeError: Cannot read property 'split' of null, at get_map_of_uuid_ids_and_field_names_to_an_array_of_field_values (/home/ec2-user/daemons/deduplication_api/v9/dupe-res/actions.js:456:82) 
     if (sanitized_string_from_api_call) { 

      var array_of_words_from_string_from_api_call = sanitized_string_from_api_call.split(/\s+/); 

      for (var k in array_of_words_from_string_from_api_call) { 
       var word = array_of_words_from_string_from_api_call[k]; 

       // 2017-02-27 -- for the sake of performance, we skip over any string of 2 letters or less. 
       // This means headquarters_country_code and headquarters_state_code need special handling. 
       if (word.length > 2) { 

        return database_queries.get_map_of_type_of_profile_and_profile_id_pointing_to_document(word) 
         .then(function(map_of_type_of_profile_and_profile_id_pointing_to_document) { 

          if (map_of_type_of_profile_and_profile_id_pointing_to_document) { 

           map_of_uuid_ids_and_field_names_to_an_array_of_field_values = merge_objects(map_of_uuid_ids_and_field_names_to_an_array_of_field_values, transform_map_of_profile_type_and_profile_id_to_map_of_uuid_to_documents(map_of_type_of_profile_and_profile_id_pointing_to_document)); 

          } 
         }); 
       } 
      } 

     } else { 
      console.log("the string value was null when api_key_whose_name_should_match_the_name_of_a_database_field was : " + api_key_whose_name_should_match_the_name_of_a_database_field); 
     } 

     return map_of_uuid_ids_and_field_names_to_an_array_of_field_values; 
    }); 
} 
+4

正確に長い名前は何ですか? – Vandesh

+0

もしそれが非同期なら、本当に戻ることはできません。 –

+0

これは面白い質問です:) –

答えて

1

まず、非同期操作を使用して結果を得る関数から結果を直接返すことはできません。解決されたときに結果を利用できるという約束を返すことができます。

第2に、ループ内で約束を返す非同期操作を呼び出すときに、いつループ内で開始されたすべての非同期操作が完了したかを知りたければ、通常の方法は約束を配列に蓄積し、それらがすべて完了したときにはPromise.all()を使用してください。

第3に、スーパーロングの変数名は、コードを読みにくくします。私はあなたの質問の目的のためにこれをしたのか、それとも一般的にこのようにコードしているのか分かりませんが、名前があまりにも長く、コードの流れや読み方がわかりにくいことがわかります。私は意味のある変数名に拍手を送っていますが、これはコードの可読性を壊してしまい、コードを処理するためにこれらすべてをタイプする必要がないと想像できません。

ので、(私には)より読みやすい変数名を作成し、上記の技術を適用した後、ここにあなたのコードの簡易版です。

function get_idMap(str, apiKey) { 
    let promises = []; 
    let idMap = {}; 
    let santizedString = database_queries.sanitize_string(str); 
    if (santizedString) { 
     santizedString.split(/\s+/).forEach(function(word) { 
     // 2017-02-27 -- for the sake of performance, we skip over any string of 2 letters or less. 
     // This means headquarters_country_code and headquarters_state_code need special handling. 
     if (word.length > 2) { 
      promises.push(database_queries.get_profileMap(word).then(function(profileMap) { 
       if (profileMap) { 
        idMap = merge_objects(idMap, transformProfile(profileMap)); 
       } 
      })); 
     }); 
    } else { 
     console.log("the string value was null when apiKey was : " + apiKey); 
    } 
    return Promise.all(promises).then(function() { 
     return idMap; 
    }); 
} 

はそして、これは約束を返すために、あなたはそれを使用しますこのように:

get_idMap(someStr, yourKey).then(function(idMap) { 
    // use the idMap here 
}).catch(function(err) { 
    // handle error here 
}); 
+1

なぜdownvote?これは、OPのコードの問題の種類を解決する方法を教えていないのですか?あなたがdownvoteのフィードバックを提供する場合、おそらく私は答えを向上させることができます。 – jfriend00

+2

変数名の長さが不足している可能性があります。

+0

真剣に。なぜ複数のdownvotes?この答えに何が間違っていますか? – jfriend00

関連する問題