如何连接数组对象和字符串以在 Javascript 中获取字符串?

索米亚·纳加拉詹

以下代码应该将一个字符串作为输入(此处为 inMessage)并拆分其中的单词。然后它在 firebase 实时数据库中查询关联的键、值,并用检索到的值替换该词。这个修改后的字符串必须作为输出发回。

现在,我似乎找不到使 'msg' 成为正确字符串的方法。如果我对字符串而不是 msg 进行硬编码,则会正确呈现输出。那么如何让 msg 成为一个合适的字符串呢?(我试过用 ""、toString()、String() 和 JSON.stringify() 将它括起来 - 这里一定有我遗漏的东西)

  function queryDB(senderID, inMessage){
    var arr=inMessage.split(" ");
    console.log(arr);
    var i;
    console.log('inside queryDB');
    var msg="";
    for(i=0;i<arr.length;i++){
    var x = 'https://oreo-fd681.firebaseio.com/'+arr[i]+'.json';
    request({
        url: x,
        method: 'GET'
      }, function(error, response, body) {
            console.log(response.body);
            if (error) {
              console.log('Error making api call ' + error);
            } else if (response.body.error){
              console.log('Error making api call' + response.body.error);
            }
            else if(response==null)  {
              //if not found in DB concatenate whatever arr[i] holds
              callback1();
            }
            else  {
              //else concatenate the found key
              var n=JSON.parse(response.body);
              //remove the quotes associated with key value
              callback2(JSON.stringify(n.key).replace(/['"]+/g, ''));
            }
      }); 
      function callback1(){
        msg+=(arr[i]);
        msg+=" ";
        console.log(msg);
      }
      function callback2(add){
        msg+=(add);
        msg+=" ";
        console.log(msg);
      }
    }
      //add quotes back - not sure of this
      sendMessageToUser(senderID, ("\""+msg+"\""));  
  }
特里科特

您的问题与request回调的异步性质有关

  • sendMessageToUser在任何请求返回结果之前执行
  • 因为i是 with 声明的var,for 的值iarr.length在任何请求返回结果之前到达,因此callback1该值将无用——它将始终引用arr[arr.length],这是未定义的
  • 假设返回的键是字符串,没有理由先将它们字符串化为 JSON,然后删除引号。事实上,如果一个键包含引号,那么这些将在该过程中丢失。
  • 不能保证对请求的响应会以相同的顺序返回。这样做很msg +=可能会构建一个键顺序错误的字符串。
  • 不是错误,但应尽量减少在循环内创建函数。所以我不会使用callback1callback2喜欢那个。

下面是一种方法,它坚持简单的旧回调模式。它有这些变化:

  • 它首先收集数组中的键,以便您可以将键放在它所属的索引处。这样,响应的顺序就无关紧要了;数组最后仍将按正确的顺序排列它们。
  • 它会跟踪我们还在等待多少回复。这样你就可以知道你什么时候收到了所有的东西,然后打电话 sendMessageToUser
  • 该变量iletfor构造中声明,因此它具有块作用域,即您为循环的每次迭代获得一个单独的变量。这样,当您在回调中引用它时,它将恰好是该版本的变量。
  • callback1callback2功能被替换为代码,可以处理两种变化(当response === null与否)。

这是代码:

function queryDB(senderID, inMessage){
    var arr = inMessage.split(" ");
    console.log(arr);
    console.log('inside queryDB');
    // At first, use an array, so you can put back the asynchronous results in the correct order
    var msgArray = [];
    // Keep track of the number of asynchronous results you are still waiting for
    var leftOver = arr.length;
    // Use LET to make loop variable block scoped: that way you'll have the same value for
    //   it when the asynchronous callback is called
    for(let i=0; i < arr.length; i++) {
        var x = 'https://oreo-fd681.firebaseio.com/'+arr[i]+'.json';
        request({
            url: x,
            method: 'GET'
        }, function(error, response, body) {
            console.log(response.body);
            if (error) {
                console.log('Error making api call ' + error);
            } else if (response.body.error){
                console.log('Error making api call' + response.body.error);
            }
            else {
                // Treat the two cases with the ternary operator
                //  and put the result at the correct index
                msgArray[i] = response === null ? arr[i] : JSON.parse(response.body).key;
                console.log(msgArray);
                // Detect when you have collected all results
                leftOver--;
                if (!leftOver) {
                    // Join all the words together into one string and send it
                    sendMessageToUser(senderID, msgArray.join(' '));  
                }
            }
        });
    }
}

就像我说的,我坚持使用回调模式,但是当你使用 Promise 和Promise.all方法时,事情会变得更好你应该调查一下。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从javascript中的字符串数组数组中获取字符串数组

如何在JavaScript中获取字符串的货币

在javascript中从选定的文本中获取字符串?

如何使用javascript从字符串中获取字符串的特定部分?

在javascript中获取字符串之间的文本模式

JavaScript 获取字符串中的 img src

在Javascript中获取字符串的变量名称

获取字符串 Javascript 中的单词

如何从javascript中的值获取字符串文字(字符数组?)?

在javascript中获取字符串数组中对象的所有叶节点属性的函数

获取字符串值,javascript

在Javascript中获取字符串数组的最小值和最大值

我如何从字符串中获取哈希,然后从JavaScript中的哈希获取字符串

获取字符串中两个子字符串之间的子字符串 [Javascript]

JavaScript - 如何根据冒号获取字符串中的标签名称和网址?

Javascript json 对象获取字符串

获取字符串数组javascript的总和

正则表达式在括号之间和Javascript中的字符串文字内部获取字符串

如何检测并获取字符串javascript的url

如何获取字符串的某些部分javascript

在JavaScript和HTML中从ResourceBundle中获取字符串

使用JavaScript中的“地址字符串”从json对象获取字段

在.NET中获取字符串的字节数组,然后在Javascript中进行转换

在Javascript中的连字符之前获取字符串中的所有内容

在Javascript中获取字符串中字符之前的文本

使用正则表达式和JavaScript获取字符串中的完全匹配

Javascript从字符串中获取对象

如何在相同的字符串之间获取字符串javascript

如何在JavaScript中获取字符串的最后一部分?