2016-09-27 7 views
0

Я пытаюсь передать значение переменной в Request API расширения расширения SDK Mozilla.Как передать API переменной для запроса в расширение SDK расширения Mozilla?

В приведенном ниже коде работает fetchRequest. Однако, когда я пытаюсь запроса другой Request (assign) в onCompletion обработчика fetch, он говорит:

RequirementError: The option "url" is invalid. 

Как использовать URL я имею в onCompletion обработчике fetchRequest для URL в assignRequest ?

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

Возможный дубликат [? Как вернуть ответ от асинхронного вызова] (http://stackoverflow.com/questions/ 14220321/how-do-i-return-the-response-from-a-асинхронный вызов) – Makyen

+0

Как написано, 'assignurl = urls.URL (...' выполняется хорошо после 'url: assignurl,'. Таким образом, когда вы 'assign.get();' url - это то, что было до выполнения показанного кода (т. е. недействительно). – Makyen

+0

@Makyen может быть, я задаю глупый вопрос, однако я не понимаю, как Я делаю это? – user2881430

ответ

1

Вы смущены порядком выполнения вашего асинхронного кода.

Как написано,

var assign = Request({ 
    url: assignurl, 

выполняет задолго до того, ваша функция выполняет строку обеспечивая ваш assignurl:

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

Называя Request() constructor, (var assign = Request({), вы назначили url так как в то время существовали assignurl. Изменение переменной assignurl после этой точки не влияет на assignRequest. Таким образом, вам нужно либо изменить assign.url, либо создать запрос после наличия URL-адреса.

ПРИМЕЧАНИЕ: Параметр url должен присутствовать и быть действительным при вызове Request конструктора. Таким образом, я предполагаю, что ваш вопрос некорректен в том, что ошибка:

RequirementError: The option "url" is invalid. 

происходит только внутри onCompletion обработчика fetch. Это должно было произойти, когда вы выполнили var assign = Request({url:asignurl с недопустимым assignurl.

Есть несколько способов, которые вы можете изменить свой код, чтобы использовать URL, который теперь у вас есть (от с fetchonComplete обратного вызова) в Request, которые вы создаете для assign. Какой метод вы используете, будет зависеть от того, будете ли вы использовать очень похожий запрос, который вы используете для assign в нескольких местах вашего кода.

Одним из возможных изменений будет двигаться создание assignRequest в 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 запросов, вы можете структурировать код таким образом, чтобы создавать assignRequest инкапсулируется в пределах 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. 
     } 
    }); 
} 

Относительно fetch.get(); в вашем fetch обработчика onComplete: Попытка сделать это должна всегда приводить к ошибке. Единственный способ добраться до этого кода является уже называется 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.

+0

Thanx @Makyen Я решил проблему и да, что 'fetch.get()' вызывается, когда аддон инициализирован – user2881430

+0

@ user2881430, я обновил код на что-то, что может реально работать (ранее первый кодовый блок создавал бы ту же ошибку). Я ошибочно полагался на свое чтение вашего Вопроса, чтобы указать, что ошибка возникает только в обработчике 'onCompletion'' fetch', когда он действительно возникает, когда 'var assign = Request ({' выполняется с недопустимым 'assignurl'. Вероятная путаница заключается в том, что вы получили 'fetch', а затем добавили' assign', после чего ошибка начала появляться (или это моя догадка относительно порядка учета, когда возникает ошибка). – Makyen

 Смежные вопросы

  • Нет связанных вопросов^_^