如何将 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

如何使用 PromiseKit 6.3 返回 Promise<JSON>

如何返回 Promise.all 获取 api json 数据?