如何将 promise 对象中返回的 JSON 对象分配给全局变量?
Posted
技术标签:
【中文标题】如何将 promise 对象中返回的 JSON 对象分配给全局变量?【英文标题】:How to assign a JSON object returned inside a promise object into a global variable? 【发布时间】:2020-11-15 06:06:54 【问题描述】:var mongoose = require('mongoose');
var Schema = mongoose.Schema;
const NewsAPI = require('newsapi');
const response = require('express');
const newsapi = new NewsAPI();
var current_date = new Date(Date.now());
var old_date = new Date(Date.now() - 864e5 - 864e5);
var current_date2 = JSON.stringify(current_date);
var old_date2 = JSON.stringify(old_date);
var today = current_date2.slice(1,11);
var day_b4_yesterday = old_date2.slice(1,11);
var feed;
newsapi.v2.everything(
q: 'food and beverage',
sources: '',
domains: '',
from: day_b4_yesterday,
to: today,
language: 'en',
sortBy: 'relevancy',
page: 2
).then(response =>
console.log(response);
feed = response;
);
var NewsSchema = new Schema(feed);
module.exports = mongoose.model('News', NewsSchema);
我需要将作为由 newsapi 创建的 JSON 对象的响应分配给全局变量,以便在新架构中使用它。我怎么做?截至目前,我无法在全球范围内访问它。
我已按如下方式更改了我的代码,现在我可以访问它,但现在我遇到了架构配置错误。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
const NewsAPI = require('newsapi');
const response = require('express');
const newsapi = new NewsAPI('87ca7d4d4f92458a8d8e1a5dcee3f590');
var current_date = new Date(Date.now());
var old_date = new Date(Date.now() - 864e5 - 864e5);
var current_date2 = JSON.stringify(current_date);
var old_date2 = JSON.stringify(old_date);
var today = current_date2.slice(1,11);
var day_b4_yesterday = old_date2.slice(1,11);
NewsLibrary = function(correct)
var promise = new Promise(function(resolve, reject)
if (correct)
newsapi.v2.everything(
q: 'food and beverage',
sources: '',
domains: '',
from: day_b4_yesterday,
to: today,
language: 'en',
sortBy: 'relevancy',
page: 2
).then(response =>
resolve(response);
)
else
reject(new Error("Error loading news"))
);
return promise;
NewsLibrary(true).then(function(response)
console.log(response);
var NewsSchema = new Schema(response);
module.exports = mongoose.model('News', NewsSchema);
).catch(function(err)
console.log(err)
);
【问题讨论】:
这能回答你的问题吗? How do I return the response from an asynchronous call? 【参考方案1】:您获取了一个全局变量feed
。但是您将响应存储在window.feed
中。
所以你应该将它存储在then
块中的feed
变量中,这是第一件事。
【讨论】:
【参考方案2】:你可以使用 global 或 GLOBAL 来分配它,nodejs 都支持:
global.feed = 响应;
或
GLOBAL.feed = 响应;
【讨论】:
当我尝试在 then 函数之外控制 feed 的值时,它使我返回 undefined。 您是指提要本身还是 global.feed 值?【参考方案3】:我认为主要问题是因为该方法是异步的。
var NewsSchema = new Schema(feed);
此代码应仅在请求完成后才有效。但我认为它会在请求完成之前运行,因为它是在承诺之外给出的(then
语句)。
理想情况下,您应该从该方法或函数返回一个承诺,该函数将返回正确的值并在导入 this 的模块中处理该承诺。一个例子是,
var model = newsapi.v2.everything(
q: 'food and beverage',
sources: '',
domains: '',
from: day_b4_yesterday,
to: today,
language: 'en',
sortBy: 'relevancy',
page: 2
).then(response =>
console.log(response);
var NewsSchema = new Schema(response);
return mongoose.model('News', NewsSchema);
);
module.exports = model ;
你可以在需要这个的文件或方法中处理这个promise的解析。如果对更多异步代码感兴趣look here at MDN web docs,
【讨论】:
我尝试了这个例子,但它抛出一个错误,指出模式尚未注册模型“新闻”。 我在之前的代码中犯了一个错误已更正它请重试。请记住,要求此文件将返回一个承诺 我实际上尝试了类似于您建议的相同错误。var NewsSchema = newsapi.v2.everything( q: 'food and beverage', sources: '', domains: '', from: day_b4_yesterday, to: today, language: 'en', sortBy: 'relevancy', page: 2 ).then(response => console.log(response); return mongoose.model('News', new Schema(response)); ); module.exports = NewsSchema ;
我对猫鼬的工作并不多。但是它不需要事先定义Schema。如果您需要在不了解架构的情况下进行惰性操作,请尝试 ***.com/questions/5370846/…。但在大多数情况下,您需要了解数据架构。以上是关于如何将 promise 对象中返回的 JSON 对象分配给全局变量?的主要内容,如果未能解决你的问题,请参考以下文章
Concat json to promise:如何从promise挂起的json对象中获取额外的键值对
如何在从 Fetch Api 返回的 Promise 对象中获取错误值?
JavaScript fetch API - 为啥 response.json() 返回一个 promise 对象(而不是 JSON)? [复制]
如何使用 promise 将数组从我的模块返回到我的 API?异步函数和承诺 - Node.js