如何确保节点js在进行异步调用后返回数据?

时间:2017-05-22 13:33:26

标签: javascript node.js

我今天在接受采访时被问到这个问题,说node.js用于进行3次REST Web服务调用。这些调用是独立的,因此您可以并行调用它们。但是,在方法结束时,您需要等待所有Web服务调用返回结果。您需要整理所有结果并将其发回。

我说过我将链接承诺并仅从第三个承诺的决心返回结果。然而,面试官对答案并不满意。我不确定是否有任何遗漏的东西。请告诉我。

编辑: 我已添加以下注释来解释我的解决方案。

我的解决方案是 -

var p1 = new Promise() // From here to make the first call
var p2 = new Promise() // Second Call
var p3 = new Promise() //Third Call

p1.resolve(p2.resolve()).p3.resolve( return result)

我认为这样我们就会阻止呼叫,直到检索到所有三个服务的数据。

2 个答案:

答案 0 :(得分:3)

我使用Promise.all()方法验证所有承诺是否已成功解决。

Promise.all()方法返回一个Promise,它在iterable参数中的所有promise已经解析时解析,或者拒绝第一个拒绝的promise。

MDN Reference, For More Info

实施例

以下示例中的webServicePromises将是一系列承诺。

  Promise.all(webServicePromises).then((responses) => {
        for(let i = 0; i< responses.length; i++){
           let response = responses[i];
           //do stuff with each web service response
        }
        },  reason => {
            console.log(reason);
        }).catch(error => logError(`${error}`));

答案 1 :(得分:1)

尝试使用this包。

import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
from matplotlib.mlab import griddata
import numpy as np
import pandas as pd

df = pd.DataFrame({'x':[0, 0, 1, 1, 3, 3, 3, 4, 4, 4], 
                   'y':[0, 1, 0, 1, 0.2, 0.7, 1.4, 0.2, 1.4, 2], 
                   'z':[50, 40, 40, 30, 30, 30, 20, 20, 20, 10]})

x = df['x']
y = df['y']
z = df['z']

xi = np.linspace(x.min(), x.max(), 100)
yi = np.linspace(y.min(), y.max(), 100)
z_grid = griddata(x, y, z, xi, yi, interp='linear')

clipindex = [ [0,2,4,7,8,9,6,3,1,0],
              [0,2,4,7,5,8,9,6,3,1,0],
              [0,2,4,7,8,9,6,5,3,1,0]]

fig, axes = plt.subplots(ncols=3, sharey=True)
for i, ax in enumerate(axes):
    cont = ax.contourf(xi, yi, z_grid, 15)
    ax.scatter(x, y, color='k') # The original data points
    ax.plot(x[clipindex[i]], y[clipindex[i]], color="crimson")

    clippath = Path(np.c_[x[clipindex[i]], y[clipindex[i]]])
    patch = PathPatch(clippath, facecolor='none')
    ax.add_patch(patch)
    for c in cont.collections:
        c.set_clip_path(patch)

plt.show()

以上示例是aync包的并行api,它还有更多。如果您正在使用节点,那么这个库非常方便。

如果有任何疑问,请告诉我。

谢谢!