在回流中,我如何从 asp.net web api 获取数据

Posted

技术标签:

【中文标题】在回流中,我如何从 asp.net web api 获取数据【英文标题】:in reflux, how can i get data from asp.net web api 【发布时间】:2015-02-13 16:36:09 【问题描述】:

我正在使用 reactjs 的回流。从 Store 的回流操作中,我编写了一个从 asp.net web api 获取数据的操作,我认为这是获取用于 ajax 的数据的唯一方法,有人跟我说,我可以使用插件 jquery 获取数据,但我没有'不要相信它,因为 $.ajax 是最好的方法。我在谷歌上搜索所有内容,但我看不到解决这个问题。如果您知道要解决的问题,请与我分享,非常感谢。

此外,我在使用 ajax 的全局变量和局部变量时遇到了问题。请查看我的代码,您会看到从不返回值的粗体文本,问题一直存在于成功块中,列表变量在块外时不会更新。那有什么问题?我该如何解决这个错误?

再次感谢您!

(function (Reflux, WorkHistoryActions, global) 

    global.workhistoryStore = Reflux.createStore(

        listenables: [WorkHistoryActions],

        init: function () 
            this.storyArr = [];
        ,

        getItems: function (resume_id) 
            console.log(resume_id)
            **var list = [];**
            $.ajax(
                type: "get",
                url: global.getHost() + "/api/workhistories/6969607988340821009",
                dataType: 'json',
                crossDomain: true,
                success: function (data) 

                    $.each(data, function (i, v) 
                        **list.push(v);**
                    )

                
            );
            **return list;**
        ,
)

【问题讨论】:

【参考方案1】:

我不确定如何在回流中执行此操作,但在正常通量架构中您会这样做:

    getItems: function (resume_id) 
        $.ajax(
            type: "get",
            url: global.getHost() + "/api/workhistories/6969607988340821009",
            dataType: 'json',
            crossDomain: true,
            success: function(result) 
                workHistoryActionCreator.receiveItems(result);
            ,
            error: function(error) 
                workHistoryActionCreator.failToReceiveItems(error);
            
        );
    

商店为操作RECEIVED_WORK_HISTORY_ITEMS和FAILED_TO_RECEIVE_WORK_HISTORY_ITEMS向调度程序注册,设置其数据,然后触发更改事件。

【讨论】:

【参考方案2】:

javascript 是一个事件驱动的系统,其中 AJAX 请求也是异步的,来自服务器的响应是异步接收的。

使用async: false 是一种不好的做法,因为它会冻结您的应用程序并阻止任何并行执行。

因此,使用async: true(这是默认设置),您无法调用进行 AJAX 调用并返回响应的函数。

解决方案 #1:回调(老派)

修改您的getItems 函数以接收另一个作为回调函数的参数,当您收到来自服务器的响应时,调用该回调函数并将list 作为参数传递给该函数调用。

示例

getItems: function(resume_id, callback) 

    $.ajax(
        type: "get",
        url: global.getHost() + "/api/workhistories/6969607988340821009",
        dataType: 'json',
        crossDomain: true,
        success: function (data) 

            var list = [];

            $.each(data, function (i, v) 
                list.push(v);
            )

            callback(list);

        
    );

    // Return nothing


如何使用?

getItem(resume_id, function(list)

);

解决方案 #2:JavaScript 承诺(推荐)

返回一个JavaScript promise 并使用then() 函数设置回调。我用kriskowal's promise implementation

示例

getItems: function (resume_id) 

    var deferred = Q.defer();

    $.ajax(
        type: "get",
        url: global.getHost() + "/api/workhistories/6969607988340821009",
        dataType: 'json',
        crossDomain: true,
        success: function (data) 

            var list = [];

            $.each(data, function (i, v) 
                list.push(v);
            );

            deferred.resolve(list);


        
    );

    return deferred.promise;


如何使用?

getItem(resume_id).then(function(list)
    // use list
);

【讨论】:

我真的很感谢 Sanket,这个决心是个好主意,我会试试的。问题是成功功能块(1)和ajax(2)之外。对于 async = true,对于优先级,(2) 是第一,(1) 是第二。结果是返回空数据。 谢谢!在与第三方系统对话时,JavaScript 完全不同。一切都是通过回调/承诺完成的。当您迁移到 Node.js 和 Mongo 时,即使是 DB 语句也可以异步工作。 我看到nodejs很难接近,我公司最近转移到Nodejs和Mongo到Reactjs和.NET API和Mongo,我觉得很幸运^_^,即使我觉得配置回流很困难reactjs,因为它与requirejs有关,我检索了requirejs文档上的所有内容,但没有一步一步进行。你觉得 reactjs 和 angular 怎么样?。 我正在 Toptal 写一篇博文,将于本周发布。标题说,“为什么我从 AngularJS 切换到 React”。我将在这里分享链接。 那太好了,我会阅读你的帖子,完成后与我分享,我的电子邮件是“phuochuy.hcmup@gmail.com”。 _.

以上是关于在回流中,我如何从 asp.net web api 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在asp.net核心中从客户端调用web api方法?

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?

如何从 ASP.net 5 web api 返回文件

如何使 ASP.NET Web API Web 服务在本地网络中可用

ASP.NET Web API 和 OpenID Connect:如何从授权码中获取访问令牌

如何从 JS 获取和保存令牌中获取 ASP.NET Web Api 令牌(登录)