Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在这种情况下,如何避免使用Firebase云函数进行承诺嵌套?_Javascript_Node.js_Firebase_Promise_Google Cloud Functions - Fatal编程技术网

Javascript 在这种情况下,如何避免使用Firebase云函数进行承诺嵌套?

Javascript 在这种情况下,如何避免使用Firebase云函数进行承诺嵌套?,javascript,node.js,firebase,promise,google-cloud-functions,Javascript,Node.js,Firebase,Promise,Google Cloud Functions,我有一个Android应用程序,可以将电话号码列表发送到我项目中的云功能。然后,服务器应检索用户所有电话号码的列表,获取两个阵列之间的交叉点(相同元素),然后将交叉点阵列中用户的Firebase Auth用户ID发送回应用程序 这就是我想到的:- // The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers. const functions = require('firebase-func

我有一个Android应用程序,可以将电话号码列表发送到我项目中的云功能。然后,服务器应检索用户所有电话号码的列表,获取两个阵列之间的交叉点(相同元素),然后将交叉点阵列中用户的Firebase Auth用户ID发送回应用程序

这就是我想到的:-

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

const auth = admin.auth();
const _ = require('underscore');

exports.getUids = functions.https.onCall((data, context) => {
    return auth.listUsers().then(userRecords => {
        var allPhoneNumbers = [];
        userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
        var phoneNumbers = _.intersection(allPhoneNumbers, data);
        var Uids = [];
        //the next line is where I am nesting promises
        phoneNumbers.forEach(phoneNumber => auth.getUserByPhoneNumber(phoneNumber).then(user => Uids.push(user.uid)));
        return Uids;
    }).catch(error => console.error(error));
});
我从未用JavaScript编程,但我正在尝试。已经两天了,我就是不知道该怎么解决这个问题。我至少试过10种不同的方法。我发现承诺真的很难处理。非常感谢您的帮助。

您可以使用它来避免此问题。请注意,对
getUserByPhoneNumber
的调用不会等待完成。你必须保证等待它。以下是一个定期承诺的实施:

return auth
  .listUsers()
  .then(userRecords => {
    var allPhoneNumbers = [];
    userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
    var phoneNumbers = _.intersection(allPhoneNumbers, data);

    return Promise.all(
      phoneNumbers.map(phoneNumber => auth.getUserByPhoneNumber(phoneNumber))
    );
  })
  .then(users => {
    return users.map(user => user.uid);
  })
  .catch(error => {
    console.error(error);
  });
下面是一个使用async/await的实现:

return auth
  .listUsers()
  .then(async userRecords => {
    var allPhoneNumbers = [];
    userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
    var phoneNumbers = _.intersection(allPhoneNumbers, data);

    const users = await Promise.all(
      phoneNumbers.map(phoneNumber => auth.getUserByPhoneNumber(phoneNumber))
    );

    return users.map(user => user.uid);
  })
  .catch(error => {
    console.error(error);
  });
您可以使用来避免此问题。请注意,对
getUserByPhoneNumber
的调用不会等待完成。你必须保证等待它。以下是一个定期承诺的实施:

return auth
  .listUsers()
  .then(userRecords => {
    var allPhoneNumbers = [];
    userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
    var phoneNumbers = _.intersection(allPhoneNumbers, data);

    return Promise.all(
      phoneNumbers.map(phoneNumber => auth.getUserByPhoneNumber(phoneNumber))
    );
  })
  .then(users => {
    return users.map(user => user.uid);
  })
  .catch(error => {
    console.error(error);
  });
下面是一个使用async/await的实现:

return auth
  .listUsers()
  .then(async userRecords => {
    var allPhoneNumbers = [];
    userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
    var phoneNumbers = _.intersection(allPhoneNumbers, data);

    const users = await Promise.all(
      phoneNumbers.map(phoneNumber => auth.getUserByPhoneNumber(phoneNumber))
    );

    return users.map(user => user.uid);
  })
  .catch(error => {
    console.error(error);
  });

@paradox我尝试使用async/await,但我在理解一般JS的语法时遇到了困难。我需要一些额外的帮助:(.我很快会在这里发布我的async/await方法,这样你们就可以告诉我我做错了什么。嵌套很好,问题是使用
forEach
@Bergi。我知道现在,我认为嵌套是个问题,因为编译器对此发出了警告。@paradox我尝试使用async/await,但我在理解JS I的语法时遇到了问题n概述。我需要一些额外的帮助:(.我很快会在这里发布我的async/await方法,这样你们就可以告诉我我做错了什么。嵌套很好,问题是使用
forEach
@Bergi。现在我知道了,我认为嵌套是个问题,因为编译器对此发出了警告。非常感谢!我从
Promise的所有文档中都了解到了。所有的
,都会的等待所有承诺返回,然后将它们的结果存储在一个数组中?我将测试代码,并在一段时间内将其标记为正确。代码工作完美,并已被标记为解决方案。是的,正是这样:需要一个承诺数组,等待它们全部成功并在数组中返回结果。非常感谢!就这样我就知道了了解
承诺的所有文档。所有
,它将等待所有承诺返回,然后将它们的结果存储在一个数组中?我将测试代码,并在一段时间内将其标记为正确。代码工作完美,并已标记为解决方案。是的,正是这样:需要一个承诺数组,直到所有承诺都成功并返回在数组中返回结果。