2017-10-09 107 views
-2

我遇到了Promise问题。我没有得到答案,因为异步。那么,我认为这是问题,因为当我运行代码时,我没有得到任何类型的错误,但我也没有得到任何答案。承诺中的异步问题

这是我的代码

'use strict' 

import validator from "validator" 
import cassandra from "./cassandra"; 
import timezone from "./timezone" 
import requestRace from "./request" 

exports.getUser = (req, res) => { 
    const getHistory = `SELECT inscriptionid,first_name,created,lastupdate,number,eventraceid ` + 
         `FROM inscription_data ` + 
         `WHERE userid = ${req.params.idUser} ` + 
        // `AND number IS NOT NULL ` + 
         `ALLOW FILTERING`; 
    if(req.params && validator.isUUID(req.params.idUser)) { 
    cassandra.execute(getHistory) 
     .then(ans => { 
      requestRace(timezone(ans.rows)) 
      .then(aws => console.log("hola")) 
      .catch(err => console.log("error: ", err)) 
     }) 
     .catch(err => res.status(500).json({code: 500,data:{error: true,message: err}})) 
    } 
} 

,这另一种

'use strict' 

import axios from "axios" 

const route = `https://ms.***.com/v1/races/` 

function requestRace(params) { 
    var newArr = new Array(), newObj = {}, hola 
    params.map(obj => { 
    axios.get(`${route}${obj['eventraceid']}?apikey=pub_nLbIjlCWNKAdB_O3qgTaoQ`) 
     .then(res => { 
     newArr.push(creaJSON(obj, res.data)) 
    // console.log("New:", newArr) 
     }) 
     .catch(err => console.log("error: ", err)) 
    }) 
return newArr.then(ho => {return ho}) 
} 

function creaJSON(obj,subojb) { 
    obj['race'] = subojb[`data`] 
    return obj 
} 


module.exports = requestRace 

如果任何人都可以看到我的错误,我将不胜感激,如果你能解释一下哪里是我的错误,为什么

谢谢你提前这么多

+0

通过“没有得到一个答案:”我假定你的意思是,服务器不发送响应?当然,你错过了这一点,你的代码中没有这样做(你只在错误情况下发送响应)。 – Bergi

+0

想想当你的代码发生什么时。如果你在购物之前去购物 - 当然你不会得到任何东西。时间很重要,而不仅仅是地点。同一个地方在不同的时间可能会或可能不会有你想要的东西。例如,在第二个函数中考虑'newArr.push'。它是什么,你如何使用它?有一个不匹配。一步一步思考它,这看起来太过于随意(构造代码)。 YOu也应该重新考虑你对map的使用 - 它应该被用来构造新的数组。 –

+0

谢谢@Mörre我发现我的错误,并用异步/等待修复。非常感谢。 –

回答

0

要解决我的问题,我不得不使用async/await。这是怎么回事结束

'use strict' 

import validator from "validator" 
import cassandra from "./cassandra"; 
import timezone from "./timezone" 
import requestRace from "./request" 

exports.getUser = (req, res) => { 
    const getHistory = `SELECT inscriptionid,first_name,created,lastupdate,number,eventraceid ` + 
         `FROM inscription_data ` + 
         `WHERE userid = ${req.params.idUser} ` + 
         `AND number IS NOT NULL ` + 
         `ALLOW FILTERING`; 
    if(req.params && validator.isUUID(req.params.idUser)) { 
    cassandra.execute(getHistory) 
     .then(ans => { 
      requestRace(timezone(ans.rows)) 
      .then(aws => res.status(200).json({code:200, data:aws})) 
      .catch(err => console.log("error: ", err)) 
     }) 
     .catch(err => res.status(500).json({code: 500,data:{error: true,message: err}})) 
    } 
} 

“使用严格的”

import axios from "axios" 

const route = `http://***/v1/inscription/` 

async function requestRace(params) { 
    var newArr = new Array(), newObj = {} 
    for(let p in params) { 
     await axios.get(`${route}${params[p]['inscriptionid']}?apikey=pub_nLbIjlCWNKAdB_O3qgTaoQ`) 
     .then(res => { 
      newArr.push(creaJSON(params[p], res.data)) 
     }).then(ok => {return ok}) 
     .catch(err => console.log("error: ", err)) 
    } 

    return newArr 
} 

function creaJSON(obj,subojb) { 
    obj['race'] = subojb[`data`] 
    return obj 
} 


module.exports = requestRace 
+1

也许下一代程序员会发现比老式的''return return Promise.all(arrayOfPromises)'更适合循环使用,它可以自动提供一个结果数组,而不需要丑陋'var newArr = []'。 –

+0

在仅存在记录错误的捕获中,(a)通过重新抛出错误来传播错误,或者(b)返回一些默认值/对象来代替缺少的结果。 –

+1

正如@ Roamer-1888所说 - 不要在循环中使用“await”(你可以并行运行) - 而且你也不应该混用promise('then' /'catch')和'await'。使用其中一种,除非有其他方式无法表达。 –