【问题标题】:How to pass Variable to Request API in Mozilla Add-on SDK extension?如何在 Mozilla Add-on SDK 扩展中将变量传递给请求 API?
【发布时间】:2016-09-27 19:35:46
【问题描述】:

我正在尝试将变量值传递给 Mozilla Add-on SDK 扩展的 Request API

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

RequirementError: The option "url" is invalid.

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

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();
    }
});

【问题讨论】:

  • 正如所写,assignurl=urls.URL(...url: assignurl, 之后执行得很好。因此,当您assign.get(); 时,url 就是执行所示代码之前的任何内容(即无效)。
  • @Makyen 可能是我在问一个愚蠢的问题,但我不明白我该怎么做?

标签: javascript firefox-addon mozilla


【解决方案1】:

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

正如它所写的,

var assign = Request({
    url: assignurl,

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

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

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

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

RequirementError: The option "url" is invalid.

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

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

一个可能的改变是将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 封装在 function 中,您可以多次调用它来创建多个非常相似的请求,如果您需要在代码的其他地方这样做:

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

每个请求对象都设计为使用一次。尝试重用它们会引发错误。

【讨论】:

  • Thanx @Makyen 我解决了这个问题,是的,fetch.get() 在插件初始化时调用了
  • @user2881430,我已将代码更新为可能实际工作的内容(以前,第一个代码块会产生相同的错误)。我错误地依赖我对您的问题的阅读来表明错误仅发生在fetchonCompletion 处理程序中,而当var assign = Request({ 使用无效的assignurl 执行时实际发生。可能的混淆是你得到了fetch 工作,然后添加了assign,此时错误开始出现(或者这是我对实际引发错误的事情顺序的猜测)。
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2018-12-05
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多