javascript - 如何在 Mozilla Add-on SDK 扩展中将变量传递给请求 API?

标签 javascript firefox-addon mozilla

我正在尝试将变量值传递给 Request API Mozilla 附加 SDK 扩展的一部分。

在下面的代码中,fetch Request正在工作。但是,当我尝试在 onCompletion 处理程序中为 fetch 请求另一个 Request (assign) 时,它会显示:

RequirementError: The option "url" is invalid.

如何将我在 onCompletion 处理程序中的 URL 用于 fetch Request 中的 URL assign 请求

var fetch = Request({
    url: 'http://itildemo.servicedeskplus.com/sdpapi/request?INPUT_DATA={%22operation%22:{%22details%22:{%22status%22:%22open%22,%22from%22:0,%22limit%22:500,%22filterby%22:%22Unassigned_System%22}}}&OPERATION_NAME=GET_REQUESTS&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&format=json',
    overrideMimeType: "text/plain; charset=latin1",
    onComplete: function (response) {
        workorder_id=JSON.parse(response.text).operation.details;
        if(workorder_id!=null){
            assignurl=urls.URL('http://itildemo.servicedeskplus.com/sdpapi/request/'+workorder_id[0].WORKORDERID+'?OPERATION_NAME=EDIT_REQUEST&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&INPUT_DATA= <Details><parameter><name>technician</name><value>'+technician_id[0].NAME+'</value></parameter></Details>');
            console.log(assignurl);
            assign.get();}
        else{fetch.get();}
    }
});

var assign = Request({
    url: assignurl,
    overrideMimeType: "text/plain; charset=latin1",
    onComplete: function (response) {
          var o=technician_id[0];
          for (var k = 0; k < technician_id.length; k++) {
              if (technician_id.length - 1 == k) {
                  technician_id[k] = o;
              } else {
                  technician_id[k] = technician_id[k + 1];
              };
          };
          fetch.get();
    }
});

最佳答案

您对异步代码的执行顺序感到困惑。

正如所写,

var assign = Request({
    url: assignurl,

在回调函数执行提供assignurl的行之前执行:

assignurl=urls.URL('http:// ...

通过调用 Request() constructor , (var allocate = Request({), 您已将 url 分配为当时存在的 assignurl。更改变量 assignurl 之后对 assign Request 没有影响。因此,您要么需要更改 assign.url,要么创建获得可用 URL 后发出请求。

注意:当您调用 Request 构造函数时,url 参数必须存在且有效。因此,我假设您的问题在陈述错误时是不正确的:

RequirementError: The option "url" is invalid.

仅发生在 fetchonCompletion 处理程序中。当您使用无效的 assignurl 执行 var allocate = Request({url:asignurl) 时,应该会发生这种情况。

您可以通过多种方式更改代码以使用 Request 中您现在拥有的 URL(来自 fetch onComplete 回调)。您正在为分配创建它。您使用哪种方法取决于您是否要在代码中的多个位置使用与用于分配的请求非常相似的请求。

一个可能的更改是将 assign Request 的创建移动到 onCompletion 处理程序中以进行 fetch :

var Request = require("sdk/request").Request;
var assignurl;          //Unknown from Question
var technician_id=[];   //Unknown from Question
var workorder_id;       //Unknown from Question

var assign;
var fetch = Request({
    url: 'http://itildemo.servicedeskplus.com/sdpapi/request?INPUT_DATA={%22operation%22:{%22details%22:{%22status%22:%22open%22,%22from%22:0,%22limit%22:500,%22filterby%22:%22Unassigned_System%22}}}&OPERATION_NAME=GET_REQUESTS&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&format=json',
    overrideMimeType: "text/plain; charset=latin1",
    onComplete: function (response) {
        workorder_id=JSON.parse(response.text).operation.details;
        if(workorder_id!=null){
            assignurl=urls.URL('http://itildemo.servicedeskplus.com/sdpapi/request/'+workorder_id[0].WORKORDERID+'?OPERATION_NAME=EDIT_REQUEST&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&INPUT_DATA= <Details><parameter><name>technician</name><value>'+technician_id[0].NAME+'</value></parameter></Details>');
            assign = Request({
                url: assignurl,
                overrideMimeType: "text/plain; charset=latin1",
                onComplete: function (response) {
                    var o=technician_id[0];
                    for (var k = 0; k < technician_id.length; k++) {
                        if (technician_id.length - 1 == k) {
                            technician_id[k] = o;
                        } else {
                            technician_id[k] = technician_id[k + 1];
                        };
                    };
                    fetch.get(); //This will throw an error (see below).  Even if it
                                 //  worked it is recursive, which is probably not
                                 //  what you desire.
                }
            });
            console.log(assign.url);
            assign.get();}
        else{
            fetch.get(); //This should always throw an error as you are attempting to
                         //  re-use the Request. In other words, the only way to get
                         //  here is if you have already done fetch.get() once
                         //  and reusing the Request throws an error. 
        }
    }
});

如果您可能发出多个 assign 请求,则可以构建代码,以便将创建 assign Request 封装在 函数,您可以多次调用该函数来创建多个非常相似的请求,如果您需要在代码中的其他地方这样做:

var Request = require("sdk/request").Request;
var technician_id=[];   //Unknown from Question
var workorder_id;       //Unknown from Question

var assign;
var fetch = Request({
    url: 'http://itildemo.servicedeskplus.com/sdpapi/request?INPUT_DATA={%22operation%22:{%22details%22:{%22status%22:%22open%22,%22from%22:0,%22limit%22:500,%22filterby%22:%22Unassigned_System%22}}}&OPERATION_NAME=GET_REQUESTS&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&format=json',
    overrideMimeType: "text/plain; charset=latin1",
    onComplete: function (response) {
        workorder_id=JSON.parse(response.text).operation.details;
        if(workorder_id!=null){
            assign = setupAssignRequest(urls.URL('http://itildemo.servicedeskplus.com/sdpapi/request/'+workorder_id[0].WORKORDERID+'?OPERATION_NAME=EDIT_REQUEST&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&INPUT_DATA= <Details><parameter><name>technician</name><value>'+technician_id[0].NAME+'</value></parameter></Details>'));
            console.log(assign.url);
            assign.get();}
        else{
            fetch.get(); //As stated above, this should always throw an error.
        }
    }
});

function setupAssignRequest(assignurl) {
    return Request({
        url: assignurl,
        overrideMimeType: "text/plain; charset=latin1",
        onComplete: function (response) {
            var o=technician_id[0];
            for (var k = 0; k < technician_id.length; k++) {
                if (technician_id.length - 1 == k) {
                    technician_id[k] = o;
                } else {
                    technician_id[k] = technician_id[k + 1];
                };
            };
            fetch.get(); //If the only code you have is what is shown, this will
                         // throw an error. It is possible that "fetch" has been 
                         // re-initialized with a new call to Request elsewhere
                         // in your code.
        }
    });
}

关于 fetchonComplete 处理程序中的 fetch.get();:尝试执行此操作总是会导致抛出错误。获取该代码的唯一方法是已经调用 fetch.get();each Request can only be used once :

Each Request object is designed to be used once. Attempts to reuse them will throw an error.

关于javascript - 如何在 Mozilla Add-on SDK 扩展中将变量传递给请求 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39732947/

相关文章:

jquery - 我怎样才能创建像 tabzilla 这样的东西?

CSS:Mozilla 滚动条插入我的元素(包括 jsfiddle)

javascript - 多个指令要求模板

javascript - 如何缓存AJAX请求的图像?

html - 绝对 css 位置 - firefox 插件使其更快?

javascript - 如何使用 xpcom 更改 firefox 代理设置

javascript - 重新打包 Firefox SDK 扩展

javascript - 按索引删除 javascript 键/值对

javascript - 我怎样才能让我的页面只刷新一次?

html - 图像在 Opera 和 Mozilla 中不起作用